1. walle运行环境搭建 (lnmp)
/usr/local/src(默认源码安装目录)
wget -c http://soft.vpser.net/lnmp/lnmp1.3.tar.gz && tar zxf lnmp1.3.tar.gz && cd lnmp1.3 && ./install.sh lnmp
2. walle安装
a. 安装git
yum -y install git
b. 设置git的user name和email
git config --global user.name "github账户";
git config --global user.email "github邮箱";
c. git与github通过ssh-key认证
cd ~/.ssh
注:没有该目录,创建即可
ssh-keygen -t rsa -C "github账户"
按3个回车,密码为空
最后得到了两个文件:id_rsa和id_rsa.pub
在github上添加ssh密钥,这要添加的是“id_rsa.pub”里面的公钥
打开https://github.com/settings/ssh ,登陆github,然后添加ssh
d. 下载安装walle
cd /home/wwwroot/default
git clone git@github.com:meolu/walle-web.git
下载vendor.tgz,可参考https://my.oschina.net/u/1422143/blog/818524
下载到walle-web根目录,解压到根目录即可
e. 配置walle
vi config/local.php
'db' => [
'dsn' => isset($_ENV['WALLE_DB_DSN']) ? $_ENV['WALLE_DB_DSN'] : 'mysql:host=127.0.0.1;dbname=walle',
'username' => isset($_ENV['WALLE_DB_USER']) ? $_ENV['WALLE_DB_USER'] : 'username',
'password' => isset($_ENV['WALLE_DB_PASS']) ? $_ENV['WALLE_DB_PASS'] : 'password',
],
vi config/params.php
第24行:
'user_driver'=>'ldap'
改为:
'user_driver'=>''
要不php需安装ldap扩展,linux服务器还得配置,没未成功,有大神配置成功,一定要私信我!
f. mysql数据库预创建database walle
mysql -uroot -p
password:
create database walle;
exit;
g. 配置nginx
删除nginx.conf里面的server配置
在vhost目录下创建
server {
listen 80;
server_name lnmp.org;
root /home/wwwroot/default/walle-web/web;
index index.php;
# 建议放内网
# allow 192.168.0.0/24;
# deny all;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$ {
expires 7d;
access_log off;
}
access_log /home/wwwlogs/walle_access.log;
}
h. 初始化项目
切换回walle-web目录
./yii walle/setup
3. walle配置流程
a. 分发原理
宿主机、目标机群、操作用户关系如下图所示,宿主机(walle所在的机器),是一个中间机器,是代码托管与远程目标机群的纽带。所以宿主机需要与代码托管(github/gitlab)和远程目标机群都建立ssh-key信任。
如果把宿主机的php进程用户(我的是www)的ssh-key添加到gitlab/github、所有目标机群,配置就完成了90%。
如何添加?添加ssh-key信任的基本教程:
先了解下几个术语:
宿主机:walle服务安装所在的机器
目标机:代码要分发到的机群
ssh-key信任:可免密码登录,一个机器的一个用户与一个机器的一个用户通过ssh-key来建立信任(一般为RSA)
b. 配置流程
1. 宿主机php进程用户www的ssh-key要加入git/gitlab的deploy-keys。
(1) 确认宿主机的php进程用户
ps aux | grep php-fpm
(2) 获取宿主机的php进程用户www的ssh-key
su www
#注:报错 This account is currently not available.
cat /etc/passwd|grep www
www:x:1002:1002::/home/www:/sbin/nologin
#/sbin/nologin->/bin/bash
再次切换www用户
su www
cat ~/.ssh/id_rsa.pub
#注:报错 cat: /home/www/.ssh: No such file or directory
mkdir ~/.ssh
ssh-keygen -t rsa -C "gitlib账号"
#按3个回车,密码为空
#最后得到了两个文件:id_rsa和id_rsa.pub
#复制宿主机公匙(id_rsa.pub)到目标机
ssh-copy-id -i ~/.ssh/id_rsa.pub remote_user@remote_server
报错:Permission denied (gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive)
可以试一下ssh
成功
c. 项目配置错误分析
1. 项目配置检测报错
宿主机:exec() has been disabled for security reasons
目标机:exec() has been disabled for security reasons
#开启php.ini 里 disable_functions 的 exec
2. 宿主机代码检出检测出错,请确认svn用户名密码无误。
(1) 没有安装svn,需要安装
one:
2017-01-10 14:19:21 -- /usr/bin/env: svn: 没有那个文件或目录
two:
原因分析:
传输协议加了ssl,svnsync第一次同步,带有--non-interactive选项,有可能会报标题所示错误。
原因是第一次认证时会弹出如下交互文字。
验证“https://192.168.1.18:443”的服务器证书时出错:
- 此证书并不是由信任的权威机权颁发。请使用此指纹手工验证其有效性!
- 证书的主机名称不匹配。
证书信息:
- 主机名称: SV0051
- 有效时间: 自 Mon, 28 Feb 2011 00:55:03 GMT 至 Thu, 25 Feb 2021 00:55:03 GMT
- 发行者: SV0051
- 指纹: f4:b2:70:22:93:95:64:cb:38:a4:4c:d0:49:9c:20:87:64:35:75:85
(R)拒绝,(t)暂时接受,或(p)永远接受?p
解决方法是:
# su www (一定要切换到walle运行php-fpm的用户下,因为是该用户和svn服务器进行交互)
第一次时不带--non-interactive,然后选择p,在以后的自动同步中带上此选项。
svn checkout -q 'https://192.168.1.100/svn/manageFormal' . --username='admin' --password='admin'
3.安装好 walle后,进行项目配置,但是检测总是出现错误,错误如下:
a. 宿主机代码检出检测出错,请确认把php进程用户www的ssh-key加入git的deploy-keys列表
问题分析:
nginx超时,504 Gateway time-out
解决方法:
1. /usr/local/ngnix/conf/nginx.conf
fastcgi_connect_timeout 1200;#300
fastcgi_send_timeout 1200;#300
fastcgi_read_timeout 1200;#300
fastcgi_buffer_size 128k;#64k
fastcgi_buffers 8 128k;#4 64k
fastcgi_busy_buffers_size 256k;#128k
fastcgi_temp_file_write_size 256k;
这里最主要的设置是前三条,即
fastcgi_connect_timeout 1200;#300
fastcgi_send_timeout 1200;#300
fastcgi_read_timeout 1200;#300
2. /usr/loca/php/etc/php-fpm.conf
pm.max_children = 40#10
"max_children" 这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。
request_terminate_timeout = 1200
如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了1200秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。
b.
目标机器检测出错,请确认php进程www用户ssh-key加入目标机器的www用户ssh-key信任列表。
目标机器检测出错,请确认www有目标机器发布版本库/data/releases写入权限。
解决方法:
1,在宿主机安装了ansible后,就消灭了一个关于ansible未安装的问题
2,其实我们是把宿主机器php进程用户www加入了目标机器www用户的信任authired_keys表的,但是任然报未加入,此处,主要的错误就是因为我们在目标机器中对于
www用户的.ssh文件夹和authorized_keys的权限和所属者:
chmod -R 644 authorized_keys
chmod -R 700 .ssh/
chmod -R 755 /home/www/
必须满足以上三个条件才能免密码登录,同时也是解决总报没有加入目标机器信任列表的问题关键
chown www.www -R /home/www 将所属者为www用户
3,需要记住的宿主机和目标机器的 .ssh authorized_keys /home/www/ 都需要注意权限问题
4,最后出现恭喜检测通过了 汗