最近shuax给我的更新器提了不少的bug,我就寻思着干脆找个什么玩意把这些东西记录下来。想起工作中经常用到的禅道,干脆自己也搭建个禅道吧。
先说说服务器环境:
- 系统:CentOS 7
- 集成环境:lnmp(by licess)
- PHP:7.1.5
- MySQL:5.7
- 禅道版本:9.3
虽然官方强烈建议直接使用他们的集成环境(zbox),但是我已经有了一个集成环境了,没必要再去跑另一个环境,所以还是决定直接安装。
安装前的检查:
这里有个小插曲,就是我突然一下子脑抽发现把MySQL密码给忘了,遂先重置一下密码,过程如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#先停止MySQL lnmp mysql stop #或者 /etc/init.d/mysql stop #然后跳过授权安全模式启动mysql /usr/local/mysql/bin/mysqld_safe --skip-grant-tables >/dev/null 2>&1 & #使用root登入 /usr/local/mysql/bin/mysql -u root #重置root密码 mysql> use mysql; #注意:大多数能搜到的语句是“update user set password=PASSWORD("ooxx") where User='root';” #这样的话执行会得到"ERROR 1054 (42S22): Unknown column 'password' in 'field list'" #实际上这个表的名字已经换成authentication_string mysql> update user set authentication_string=PASSWORD("ooxx") where User='root'; #清理并退出 mysql> flush privileges; mysql> quit #重启 killall mysqld lnmp mysql start #或者 /etc/init.d/mysql start |
插曲结束,继续:
先去翻看一下禅道官方的安装手册
总结下来只有一个要求,那就是需要php有pdo, pdo_mysql, json, filter这几个模块, php -m 看了一下,都有。
开始安装:
首先建立相应的vhost,由于我是lnmp集成环境,直接 lnmp vhost add 。
向导完成之后会在对应的位置建立Home Directory文件夹(这里我假设是/home/wwwroot/ooxx/)。cd过去,在禅道的下载页找到相应的下载链接然后wget下来,unzip解压,解压后发现出现了子目录zentaopms,使用 mv zentaopms/* . 将其移出来。
由于禅道的架构设计,需要将home改为/home/wwwroot/ooxx/下的www,编辑当前vhost的conf文件,找到root段,在/home/wwwroot/ooxx后面加上/www,然后保存并退出, nginx -s reload 重载nginx。
此时浏览器打开相应的地址,我遇到了第一个坑,服务器提示500
于是前往禅道的www目录,编辑index.php,将 error_reporting(0); 改为 ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);
再次刷新,看到提示: Warning: include(): open_basedir restriction in effect. File(/home/wwwroot/ooxx/framework/router.class.php) is not within the allowed path(s)
原来是引用错误,想起禅道的架构是上层引用的,而此时默认的open_basedir在/home/wwwroot/ooxx/www这个子文件夹中,引用不到上级目录中的东西,所以继续编辑vhost的conf,找到server中的fastcgi_param段(由于我用的集成环境,是采取引用enable-php.conf的形式,所以我将其注释掉然后从相应的文件中将内容复制过来),找到其中的fastcgi_param PHP_ADMIN_VALUE行,将其改为 fastcgi_param PHP_ADMIN_VALUE “open_basedir=$document_root:/tmp/:/proc/:/home/wwwroot/ooxx“; 注意我标红的地方
再次刷新,已经能够出现安装界面了,但是碰到了第二个坑:安装检查没有通过,提示Session目录不存在
那么继续,找到php的配置文件(如果不知道在哪就使用 php -i | grep 'Configuration File' 命令来查找),然后定位到session.save_path的行,给它赋值一个当前php用户可写的目录。
重载一下php-fpm,再次刷新,已经可以正常安装了。
安装完成以后,发现地址栏的地址不是伪静态的,而是直接的index.php+query路径,根据禅道官方说法,我需要修改requestType为PATH_INFO,所以找到我的禅道配置文件(我这里是/home/wwwroot/ooxx/config/my.php),将 $config->requestType = 'GET'; 改为 $config->requestType = 'PATH_INFO';
再次刷新,遇到了第三个坑:404 Not Found
应该是伪静态的问题,观摩一下禅道官方集成环境的.htaccess,找到它的伪静态
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*)$ index.php/$1 [L] </IfModule> |
由于nginx的-e可以同时代表-f和-d,所以nginx的伪静态可以写成这样
1 2 3 4 |
if (!-e $request_filename){ rewrite /(.*)$ /index.php/$1 last; break; } |
将上面这段加到 location / {} 里面,让nginx -s reload
自信满满,再次刷新,没想到依然404,打开日志看看,说是根本没找到PATH_INFO这个变量
去搜索一番,在这个帖子里面找到解决方案,修改vhost的php段,加入PATH_INFO相关内容:
(这里请注意一下,帖子里面也有相关的伪静态配置,核心语句为 rewrite ^(.*)$ /index.php?s=$1 last; ,这个实际上并不能在新版的禅道中生效,各位可以观察一下和我上面写的有什么不同)
1 2 3 4 5 6 7 8 9 10 11 12 |
set $path_info ""; set $real_script_name $fastcgi_script_name; if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") { #将文件地址赋值给变量 $real_script_name set $real_script_name $1; #将文件地址后的参数赋值给变量 $path_info set $path_info $2; } #配置fastcgi的一些参数 fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; fastcgi_param SCRIPT_NAME $real_script_name; fastcgi_param PATH_INFO $path_info; |
保存之后再次重载nginx,浏览器刷新,终于正常,可喜可贺……
最后将index.php中开启的详细错误关闭,并清理掉为了方便观察加入的多余的nginx日志变量。
总结:
- 善用搜索引擎
- 多看日志
- 抄代码时动动脑筋,想想哪些可以抄哪些不能抄
- 最好能研究一下别人为什么会那样写
1条评论. Leave new
这过程,嗯,坑都可以挖成河了