当前位置:首页 > 服务器 > 正文

centos 7.1搭建nginx+php+mysql+yii环境流程备忘

一个后台管理系统,基本架构是使用nginx做接入层,将请求转发给PHP,通过php-cgi.sock进行处理;mysql进行后台的订单管理;整个系统是基于yii 1.13版本实现的;刚开始以为很简单的部署,其实还是经历了很多坑,这里详细的记录下,以帮助后来的人少走点弯路;
(1)先查看centos的版本信息;centos系统版本等信息
之所以先查看版本,是因为不同的版本,安装的包括php,mysql等都不太一样;尤其是mysql;在7.0之后的版本没有mysql-server;比如我们服务器的版本信息如下:
[root@iZ94bytxhq5Z log]# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.0.1406 (Core)
Release: 7.0.1406
Codename: Core
[root@iZ94bytxhq5Z log]# uname -a
Linux iZ94bytxhq5Z 3.10.0-123.9.3.el7.x86_64 #1 SMP Thu Nov 6 15:06:03 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

在安装mysql的时候,就碰到一个大坑,我们辛辛苦苦的下载了mysql的源码,居然发现总是安装失败;
想死的心都有;很奇怪,在7.0之后源码编译mysql会出现编译异常;缺少mysql-server;所以放弃最初yum的安装方式;而且安装的默认非mysql;是因为mysql社区为了防止oracle将mysql闭源;所以采用的是rpm的安装方式:

# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
# rpm -ivh mysql-community-release-el7-5.noarch.rpm
# yum install mysql-community-server
成功安装之后重启mysql服务
# service mysqld restart
初次安装mysql是root账户是没有密码的
设置密码的方法
# mysql -uroot
mysql> set password for ‘root’@‘localhost’ = password(‘mypasswd’);
mysql> exit

(2)nginx的安装:nginx的安装相对比较简单;网上一堆,主要是主要nginx的配置;比如对php的支持,是采用http的方式,还是使用socket的监听方式;网上有资料说socket的效率比http的高出不少,我觉得靠谱,毕竟HTTP算应用层协议:
location ~ .*\.(php|php5)?$
{
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
}

(3)php的安装;如果在centos上面默认安装php,安装的是php-cli 5.4的版本;不是特别的定制化;所以php打算直接通过源码安装;而且php的安装涉及到的模块加载很多,所以通过源码安装是比较靠谱的安装方法;另外很多项目,比如涉及到验证码,yii还使用的是mysql-pdo的数据库连接方式;所以需要支持很多模块,同时是默认使用php-fpm进行php的进程管理;用了php-fpm,就不需要用到aspx2了;为了支持Yii 1.13版本,我的php的configure命令如下:


如果碰到:
configure: error: xml2-config not found. Please check your libxml2 installation.
证明需要安装xml库;一般可以先搜索下:
rpm -qa | grep libxml2 然后通过:
yum install libxml2
yum install libxml2-devel -y 安装即可;
为了确认,可以find / -name 'xml2-config'
就可以找到:/usr/bin/xml2-config

接下来可能会发现有:
error: Cannot find OpenSSL's 类似这样的错误,意思是说没有安装openssl,一样的方法,安装
yum install openssl
yum install openssl-devel

接下来可能会碰到:
configure: error: Please reinstall the libcurl distribution -
easy.h should be in /include/curl/
这样的错误,同样的:
yum install libcurl
yum install libcurl-devel

所以一般是在安装之前先安装默认的环境:
sudo yum install gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel \
glibc glibc-devel glib2 glib2-devel openssl-devel bzip2-devel libcurl-devel t1lib-devel gmp-devel libc-client-devel openldap-devel unixODBC-devel \
mysql-devel expat-devel libxslt-devel libmcrypt libmcrypt-devel libedit wget

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt --enable-ftp --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --disable-fileinfo

当然如果编译过程有什么问题,记得先make clean一下;
如果之前用yum install过php,可以先删除之前安装过的包,主要是各种php库的依赖;具体方法如下:

必须强制删除

#rpm -qa|grep php

提示如下

#php-pdo-5.1.6-27.el5_5.3
#php-mysql-5.1.6-27.el5_5.3
#php-xml-5.1.6-27.el5_5.3
#php-cli-5.1.6-27.el5_5.3
#php-common-5.1.6-27.el5_5.3
#php-gd-5.1.6-27.el5_5.3

注意卸载要先卸载没有依赖的

pdo是mysql的依赖项;common是gd的依赖项;
例如:# rpm -e php-pdo-5.1.6-27.el5_5.3
error: Failed dependencies:
php-pdo is needed by (installed) php-mysql-5.1.6-27.el5_5.3.i386

所以正确的卸载顺序是:
# rpm -e php-mysql-5.1.6-27.el5_5.3
# rpm -e php-pdo-5.1.6-27.el5_5.3
# rpm -e php-xml-5.1.6-27.el5_5.3
# rpm -e php-cli-5.1.6-27.el5_5.3
# rpm -e php-gd-5.1.6-27.el5_5.3
# rpm -e php-common-5.1.6-27.el5_5.3

再用# php -v

查看版本信息已经没有提示就卸载OK了;

make && make install就可以看到php已经安装成功了;

(4)关于yii的一些坑;比如说过了支持pdo-mysql,所以通过phpinfo()应该可以看到php已经支持PDO的支持了;drive是mysql和sqlite;它读取mysql-driver的方式,默认是mysql的配置,比如是/tmp/mysql.sock;不过如果我们通过上述安装mysql的方法,mysql.sock可能是在/usr/local/var/mysql/mysql.sock,但是php不是找这个目录的;所以会在new PDO_Mysql的时候回报错;其实修改很简单,只需要修改php.ini的配置文件中,加载路径即可;不过源码编译后,可以通过phpinfo()查看php的配置文件搜索路径,比如是/usr/local/php/etc/php.ini,可能php.ini不在这个目录,find / -name php.ini你可以搜索到,然后cp到相应的etc目录;修改下默认mysql的socket目录即可;

[Pdo_mysql]
; If mysqlnd is used: Number of cache slots for the internal result set cache
; http://php.net/pdo_mysql.cache_size
pdo_mysql.cache_size = 2000

; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
; http://php.net/pdo_mysql.default-socket
pdo_mysql.default_socket= /var/lib/mysql/mysql.sock

还有关于yii路由的一些坑,比如路由机制:


'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'urlSuffix'=>'.html',
'caseSensitive' => false,
'rules'=>array(
//WWWURL=>array('/admin/login', 'urlSuffix'=>'.html', 'caseSensitive'=>false),
//'/'=>'/view',
//'//'=>'/',
//'/'=>'/',
),
),

if(strstr(WWWURL,'admin')){
$tmp = str_replace('http://admin','',WWWURL);
$__config['components']['urlManager']['rules'][WWWURL] = array('/admin/login', 'urlSuffix'=>'.html', 'caseSensitive'=>false);
$__config['components']['urlManager']['rules']['http://<_m:(admin)>'.$tmp.'<_q:.*>/*'] = '<_m><_q>';
}

这样是为了方便SEO,restful方式的url地址;

先暂时讨论到这里;希望对大家有帮助;欢迎留言~

6 条评论

  1. 6楼2016-03-26 下午4:57
    jackqqxu

    如果想安装5.3.28的版本,可以使用:
    wget http://cn2.php.net/distributions/php-5.3.28.tar.bz2

  2. 5楼2016-04-02 下午5:50
    jackqqxu

    如果碰到:
    configure: error: xml2-config not found. Please check your libxml2 installation.
    证明需要安装xml库;一般可以先搜索下:
    rpm -qa | grep libxml2 然后通过:
    yum install libxml2
    yum install libxml2-devel -y 安装即可;
    为了确认,可以find / -name ‘xml2-config’
    就可以找到:/usr/bin/xml2-config

    接下来可能会发现有:
    error: Cannot find OpenSSL’s 类似这样的错误,意思是说没有安装openssl,一样的方法,安装
    yum install openssl
    yum install openssl-devel

    接下来可能会碰到:
    configure: error: Please reinstall the libcurl distribution –
    easy.h should be in /include/curl/
    这样的错误,同样的:
    yum install libcurl
    yum install libcurl-devel

    所以一般是在安装之前先安装默认的环境:
    sudo yum install gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel \
    glibc glibc-devel glib2 glib2-devel openssl-devel bzip2-devel libcurl-devel t1lib-devel gmp-devel libc-client-devel openldap-devel unixODBC-devel \
    mysql-devel expat-devel libxslt-devel libmcrypt libmcrypt-devel libedit wget

  3. 4楼2016-04-02 下午6:02
    jackqqxu

    yum install nginx
    有时候nginx重启的时候,会提示:80端口被占用;
    很可能是自己占用了;
    于是:killall -9 nginx
    service nginx restart

  4. 地板2016-04-02 下午6:54
    jackqqxu

    在5.3.28的版本中,已经默认包含了php-fpm的源码;在编译的时候,使用–enable-fpm就启动了对php-fpm的支持;不过它默认的配置文件,是php-fpm.conf.default;
    修改下默认的php-fpm的配置,比如监听listen的方式:

    ERROR: [pool www] cannot get uid for user ‘www’
    因为php-fpm默认的用户和用户组是www.www;网上有人说直接添加当前的登录用户,比如我当前是root,这样php-fpm都是root权限去执行,肯定是不太合理的;
    所以还是直接添加www.www的用户组;

    方法:
    [root@VM_50_243_centos shm]# groupadd www
    [root@VM_50_243_centos shm]# useradd –shell /sbin/nologin -g www www
    [root@VM_50_243_centos shm]# /usr/local/php/sbin/php-fpm
    [root@VM_50_243_centos shm]# ps aux | grep php-fpm
    root 16033 0.0 0.2 211420 3908 ? Ss 18:52 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
    www 16034 0.0 0.2 213504 4172 ? S 18:52 0:00 php-fpm: pool www
    www 16035 0.0 0.2 213504 4172 ? S 18:52 0:00 php-fpm: pool www
    root 16038 0.0 0.0 112656 936 pts/1 R+ 18:52 0:00 grep –color=auto php-fpm

  5. 板凳2016-04-02 下午7:00
    jackqqxu

    当然经过修改过后的php-fpm.conf的listen方法,比如通过sock监听,sock文件位于/dev/shm/,就可以在这个目录看到php-cgi.sock文件了;另外刚才创建的www用户,就可以看到在home目录下已经存在了www的这个文件夹;只是该用户是无法通过shell登录到服务器的;
    比如:
    listen = /dev/shm/php-cgi.sock ;这里的/dev/shm是内存目录,速度非常快;

  6. 沙发2016-04-02 下午10:25
    jackqqxu

    当一切都默认配置好了后,php.ini是默认没有的;安装了php,可以将php的安装路径增加到PATH中;vim /etc/profile,然后在path中增加php所在的路径,比如/usr/bin/;另外php.ini是需要通过php.ini.development 拷贝到php默认的搜索路径:/usr/local/php/etc/php.ini;这里的php.ini才是可以生效的;
    当然这里还需要配置包括(如果你是用的yii的PDO_MYSQL进行配置的,那么需要配置
    pdo_mysql.default_socket= /var/lib/mysql/mysql.sock;这里的mysql.sock是mysql所在的位置。否则可以通过phpinfo()看到这里默认搜索的是/tmp/mysql.sock,如果tmp目录下没有改sock文件,则会出现:
    exception ‘CDbException’ with message ‘CDbConnection failed to open the DB connection: SQLSTATE[HY000] [2002] 这样的错误;

发表评论

您必须 [ 登录 ] 才能发表留言!