第九区

一个程序员的经验笔记

2019年5月20日
发表者 will
暂无评论

centos安装和升级nodejs/npm极简步骤

nodejs官网推荐的几种安装方式都不是很喜欢(主要是官网下载网速太慢),所以个人还是喜欢走yum。
1. yum方式安装nodejs和npm

yum install nodejs
  1. 指定中国镜像源
npm config set registry http://registry.cnpmjs.org
  1. 安装n组件并通过n组件升级npm到稳定版本
npm install -g n
n stable
  1. 升级npm
npm install -g npm

安装和升级完成

2018年4月12日
发表者 will
暂无评论

用dockerfile制作自己的LNMP镜像

[toc]

本篇目的

  • 本文是《用docker部署WEB项目》的第三篇
  • 上一篇文章我们练习了如何在alpine上搭建自己的网站,这次我们练习如何用dockerfile建一个基于alpine的镜像。
  • 在web项目的迭代过程中,nginx和php的配置更改和升级可能性比较大,放在同一个镜像中交付会比较方便。

前置条件

新建dockerfile文件

  • 在电脑上新建文件夹c:\docker\docker_files\mylnmp
  • 在mylnmp文件夹中用编辑器新建一个文件dockerfile,录入内容
#基于alpine镜像
FROM php:7.2.4-fpm-alpine3.6
LABEL maintainer="will <will@cn09.com>"
RUN \
    echo "http://mirrors.aliyun.com/alpine/v3.6/main" > /etc/apk/repositories \
    && echo "http://mirrors.aliyun.com/alpine/v3.6/community" >> /etc/apk/repositories \
    && apk update \
    && apk add --no-cache nginx supervisor \
#  && docker-php-source deleted \
    && rm /etc/nginx/nginx.conf \
    && mkdir /run/nginx \
    && mkdir /etc/supervisor.d
ADD nginx.conf /etc/nginx
ADD default.conf /etc/nginx/conf.d
ADD supervisord-nginx-php.ini /etc/supervisor.d
ADD run.sh /
ADD index.tar /var/www/html
RUN chmod 0777 /var/www/html -R
EXPOSE 80
CMD ["/run.sh"]

基本上,对照上一篇文章中的练习,这段dockerfile中的代码都比较容易理解。
命令中的几个ADD用于将本地文件复制到镜像中;
nginx.conf文件在系统中已存在所以需要先删除然后再制。

相关文件准备

生成和使用镜像

  • 在mylnmp文件夹中输入命令行生成镜像
docker build -t mylnmp .
  • 用生成的镜像制作容器
docker run --rm -d -p 8080:80 mylnmp
  • 在浏览器中访问http://127.0.0.1:8080 和http://127.0.0.1:8080/info.php 验证效果

安装完成

现在我们已经成功制作和使用了第一个自己的docker镜像。

版权申明

本文来自 第九区,转载请保留本段文字。

2018年4月12日
发表者 will
暂无评论

在docker的alpine类镜像上安装LNMP服务

[toc]

安装目的

  • 本文是《用docker部署WEB项目》的第二篇
  • alpine是docker官方推荐的linux发行版,基于它制作docker,文件体积会小很多
  • alpine和常用的centos、ubuntu等相比还是会有一些区别,所以需要通过今天的练习进行一些了解。

前置条件

新建容器并进入内部

docker run -it -p 18080:80 -p 21:21 -p 3306-3306 php:7.2.4-fpm-alpine3.6 /bin/sh

指定国内镜像源

  • 输入命令行打开repositories文件
cd /etc/apk
vi repositories
  • 在文件中输入源地址:
http://mirrors.aliyun.com/alpine/v3.6/main
http://mirrors.aliyun.com/alpine/v3.6/community

安装nginx

安装

apt add --no-cache nginx

保护pid

cd /run
mkdir nginx

新建设置网页

  • 新建一个网页index.html
cd /var/www/html
vi index.html
  • 写一个简单的html页面或是只输入一行文字如
hello world

修改nginx的配置文件

  • 修改配置文件/etc/nginx/conf.d/default.conf,只保留最基本配置
server {
        listen 80 default_server;
        location / {
                index index.html;
                root /var/www/html;
        }
        location = /404.html {
                internal;
        }
}

运行nginx

  • 输入命令行重启nginx
nginx -s reload
  • 打开浏览器,输入http://127.0.0.1:18080 ,看到网页显示hello world,nginx安装成功。
/usr/sbin/nginx -c /etc/nginx/nginx.conf

验证成功

打开浏览器,输入127.0.0.1,看到网页显示hello world,nginx安装成功。

在网站中启用php

添加PHP支持

  • 修改/etc/nginx/conf.d/default.conf文件,增加php支持
server {
        listen 80;
        index index.html index.php;
        location / {
                index index.html;
                root /var/www/html;
                #实现PHP伪静态
                try_files $uri /index.php?$args;
        }

        # You may need this to prevent return 404 recursion.
        location = /404.html {
                internal;
        }
        #添加php支持
        location ~ .php {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
                include fastcgi_params;
        }
}

请确认 /etc/nginx/nginx.conf中包含include config.d/*.conf语句,否则default.conf将不会生效,另外,nginx.conf中如果已经有一个server服务器,也可能造成端口冲突,这些问题的处理方式,和其它linux发行版是一样的。

新建测试用的php文件

  • 输入命令行新建一个info.php文件
vi info.php
  • 写一个简单的php文件如:
<?php
phpinfo();
  • 输入命令行新建一个index.php文件
vi index.php
  • 写一个简单的php文件如:
<?php
echo 'Hello php';

重启php和nginx服务

  • 输入命令行重启服务
php-fpm --daemonize
nginx -s reload

验证成功

  • 打开浏览器访问http://127.0.0.1:18080/info.php 会显示phpinfo信息,php支持已安装成功
  • 打开浏览器访问http://127.0.0.1:18080/anyting 会显示hello php,伪静态已设置成功

安装常用php组件

  • alpine提供了docker-php-ext-install来安装常用的php扩展,当前已支持如下扩展
    > Possible values for ext-name:
    bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv imap interbase intl json ldap mbstring mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline recode reflection session shmop simplexml snmp soap sockets sodium spl standard sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zend_test zip

由于我们选择的镜像不是最基本的alpine而是php:7.2.4-fpm-alpine3.6 ,这些镜象其实都已经预装了,所以下面的命令只是一个示范,它会提示扩展已安装过:
– 命令来快速安装php组件

docker-php-ext-install fileinfo

如果要装这些以外的扩展就会比较复杂,这篇文章里就不提了。

安装完成

现在我们已经熟悉了alpine,接下来我会练习用dockerfile完成今天的工作,制作第一个自己的docker镜像。

版权申明

本文来自 第九区,转载请保留本段文字。

2018年4月7日
发表者 will
暂无评论

使用docker-compose安装pure-ftp

[toc]

安装目的

  • 本文是《用docker部署WEB项目》的第一篇
  • pure-ftp用于管理独立于doker容器之外的数据文件,建议安装到开发环境和测试环境并对程序员开放权限
  • pure-ftp安装简单, 建议作为第一个docker服务进行练习

前置条件

  • 学习 Docker从入门到实践
  • 测试环境建议为windows10专业版和ubuntu16.04,其它环境本人未测试
  • 已在服务器上安装docker ce和docker-compose

安装准备

  • 新建docker文件夹,如d:\docker(windows)或/opt/docker(ubuntu),作为学习时的简化操作,它将映射到ftp用户根目录,用户可以通过ftp管理这个文件夹。
  • 新建docker/data/pure-ftpd/conf文件夹,用于存放pure-ftpd的配置数据,这样以后每次删除pure-ftpd容器重新安装时,就不用再重新设置ftp的用户名和密码了
  • 新建一个空文件夹,为与后续文章保持一致性,建议文件夹路径为docker/data/pure-ftpd/docker_compose
  • ubuntu下设置docker文件夹权限为0777,以便于后续操作和学习

新建docker-compose安装文件

在docker/docker_compose/pure-ftpd文件夹下新建一个文件,文件名为docker-compose.yml

version: "2"
services:
    ftp:
        container_name: pure_ftpd
        image: stilliard/pure-ftpd
        volumes:
            - "/opt/docker:/home/ftpusers/docker_admin"
            - "/opt/docker/data/pure-ftpd/conf:/etc/pure-ftpd"
        # restart: always
        ports:
            - "21:21"
            - "20000-20200:20000-20200"
            - "30000-30200:30000-30200"
        environment:
            PUBLICHOST: localhost

安装文件的命令说明

  • version 当前版本号
  • services 服务
  • ftp 服务名称,可随意命名
  • container_name 强制定义容器名称,如删除此行,系统会自动命名容器
  • image 从哪个镜像进行安装
  • volumes 映射文件路径
  • “/opt/docker/data:/home/ftpusers/docker_admin” 把之前建立的/opt/docker文件夹映射到用户根目录,windows下本行应改为
"d:/docker:/home/ftpusers/docker_admin"
  • “/opt/docker/data/pure-ftpd/conf:/etc/pure-ftpd” 把之前建立的/opt/docker/data/pure_ftp/conf文件夹映射到配置目录,windows下本行应改为
"d:/docker/data/pure-ftpd/conf:/etc/pure-ftpd"
  • restart: always 容器会随着docker自动重启,一开始测试时建议先把这行注释掉,等安装完成测试成功后重新安装时再加上这行。
  • ports 指定容器开放的端口
  • “21:21” ftp的默认端口
  • “20000-20200:20200” 被动模式端口
  • “30000-30200:30200” 主动模式端口
  • environment 设置镜像的环境变量
  • PUBLICHOST: localhost 默认服务器名称

进行安装

执行安装命令生成容器

docker-compose up -d

这条命令必须在docker/docker_compose/pure-ftpd下执行
-d参数让容器启动后在后台运行

添加用户

  • 执行命令进入容器内部
docker exec -it pure_ftp bash

执行这条命令后注意盘符变化,现在,你已经在容器内部了

  • 添加一个ftp用户
pure-pw useradd docker_admin -f /etc/pure-ftpd/passwd/pureftpd.passwd -m -u ftpuser -d /home/ftpusers/docker_admin
pure-pw mkdb
exit

输入第一行命令后系统会提示输入密码和确认密码
注意第一行命令结尾的路径,这正是我们之前映射的地址

安装完成

现在ftp容器已经成功安装了,可以通过ftp软件在docker文件夹进行上传和下载,后续我会写一些系列文章都将指定docker为学习文件夹,以便于调试。

版权申明

本文来自 第九区,转载请保留本段文字。

2015年11月25日
发表者 will
暂无评论

Yii2自定义表单按钮

Yii2的GridView里有时需要自定义操作按钮,比如对目录的操作,如果该目录有子目录,则不显示删除按钮,以下代码对此进行了演示:

[
    'class' => 'yii\grid\ActionColumn',
    'header' => '操作',
    'buttons' => [
        'delete' =>
        function ($url, $model, $key) {
            if ($model->has_child) {
                return '';//如果有子目录不显示删除按钮 
            } else {
                $options = array_merge(
    [
        'title' => Yii::t('yii', 'Delete'),
        'aria-label' => Yii::t('yii', 'Delete'),
        'data-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?'),
        'data-method' => 'post',
        'data-pjax' => '0',
    ]
                );
                return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, $options);
            }
        }
            ]
        ]

 

 

2015年11月25日
发表者 will
暂无评论

Yii2添加一个非字段属性

比如,要给Yii2添加一个has_child属性,判断一个目录是否有子目录,可以在model里:

1.添加属性:

    public function attributeLabels() {
        return [
            'id' => '编号',
            'title' => '标题',
            'parent_id' => '上级编号',
            'description' => '说明',
            'disabled' => '是否禁用',
            'sort_num' => '排序',
            'has_child'=>'是否有子目录'//添加属性
        ];
    }

2.给属性赋值:

    public function getHas_child(){
        $child=$this->findOne(['parent_id'=>$this->id]);
        $hasChild=$child?1:0;
        return $hasChild;
    }

然后就可以在view里用has_child直接调用了。

2015年11月18日
发表者 will
暂无评论

Yii2的两个小问题

今天遇到了两个Yii2的小细节。

一个是Yii2的debug,平时都在本地测试,而 部署到生产环境前,都是关掉的。今天才发现,原来就算不关,外网也不会显示的,除非在config里加上自己的ip地址:

    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
        'allowedIPs' => ['1.2.3.4', '127.0.0.1']
    ];

在allowedIPs里的ip地址,才会显示debug条。

二是在form表单里:

    <?= $form->field($model, 'description')->textInput(['maxlength' => true,'aaa''=>'bbb'])->label(FALSE) ?>

之前一直只在数组里输入象maxlegth这样的标准参数,今天才发现,不管输入什么,比如aaa=>bbb,都会显示到html里,这样,写jquery就方便多了,另外->label(FALSE)可以不显示label,表单配置可以更灵活。

2015年11月5日
发表者 will
暂无评论

使用Yii2扩展

随着时代的发展,社区化编程渐渐成为潮流。在github的基础之上,我们可以用composer安装yii,然后配置composer.json文件,就可以安装所有以composer包形式发布的软件并保持同步更新。最新版本的jquery,最新版本的bootstrap,最新版本的各种第三方插件……对于我这种不升级会死星人来说,这就是最好的梦想了。

composer.json的中文文档可详见:https://github.com/5-say/composer-doc-cn/blob/master/cn-introduction/04-schema.md#minimum-stability

要添加一个扩展,可以在composer.json中插入扩展的名称,比如加入一个YII官方的缩略图类:

{
    // ...
    "require": {
        // ... other dependencies
        "yiisoft/yii2-imagine": "*"
    }
}

然后运行窗口命令composer install,一个新的扩展就是下载成功了。

 

2015年11月3日
发表者 will
暂无评论

Yii2的前端资源Assets

Yii2的前端资源是指css、js、图片和视频等静态文件,这些文件必须放到web可访问的文件夹下才能正常访问,而模块化开发时,我们总会希望一个模块的文件能够打包在同一个文件夹下以便于传播和发布。比如,如果我们开发一个小部件widgets,希望把它开源出来放到github或是打包放在什么网站上供人下载,配一个说明文档要求下载者把哪些文件夹放到哪些指定的位置,总会非常地不便,所以最好用Assets进行统一管理。

前端资源主要在视图和小部件里调用,它可以直接调用静态文件,也可以把文件发布到指定文件夹中,甚至还能用扩展语法如LECSS、SCSS、TYPESCRIPT来写相关代码。

 

要使用LECSS等扩展语法,需要安装LECSS并在main.php里进行如下配置:

return [
    'components' => [
        'assetManager' => [
            'converter' => [
                'class' => 'yii\web\AssetConverter',
                'commands' => [
                    'less' => ['css', 'lessc {from} {to} --no-color'],
                    'ts' => ['js', 'tsc --out {to} {from}'],
                ],
            ],
        ],
    ],
];

用netbeans开发项目时,netbeans自带LECSS转换功能,非常好用,建议不必采用yii2来完成这一工作。

自定义一个外部资源包可以参考basic演示中的代码:

<?php

namespace app\assets;

use yii\web\AssetBundle;

class AppAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
        'css/site.css',
    ];
    public $js = [
    ];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}

如果需要自动转换LESS,则应该这么写:

<?php
namespace app\assets;
use yii\web\AssetBundle;
class AppAsset extends AssetBundle
{
    public $sourcePath = '@webroot/less';//指定less文件所在的目录
    public $css = [
        'site.less',//指定less文件
    ];
    public $js = [
    ];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}

 

2015年11月2日
发表者 will
暂无评论

Windows环境下安装LESSCSS并完成netbeans配置

LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,用它,我们就可以象写动态语言那样写CSS了。

LECSSCSS已经受到了广泛的支持,用LESSCSS完成代码后,有多种方式可以调用它,比如,直接用less.js在客户端完成渲染,也可以用Yii2等框架来把它转为css,LESSCSS官方也提供了桌面版的转换程序,我们可以用netbeans方便地进行调用。

LESSCSS官方提供的程序是基于nodejs,通过npm进行安装的,所以,我们要先安装node.js。

一、下载和安装node.js

访问网址https://nodejs.org/en/download/,下载对应版本软件,执行安装。

二、安装LESSCSS程序

执行cmd窗口命令,到达nodejs的安装目录如c:\program files\nodejs,执行命令:

npm install -g less

三、在netbeans中配置less

打开netbeans,点击菜单工具-选项-其他,输入安装好的lessc.cmd程序位置:

netbeans配置LESSCSS

四、在项目中指定less源文件夹和输出文件夹:

最后,我们要为每个网站项目指定它的less源文件夹和输出文件夹,源文件夹和输出文件夹可以有多个。

右键单击项目名称,选择属性,在打开的窗口中选择css预处理程序,点击less标签,然后输入相应的文件夹:

lesscss项目配置

这样,配置就完成了,偿试在/less文件夹中写入一个测试的less文件,单击保存,css文件夹中就出现了一个同名的css文件,配置成功。