Linux下源码方式安装Nginx和PHP(FastCGI)

作者:袖梨 2022-11-14

这里以CentOS 5.5下 Nginx 1.2.3和PHP 5.2.17为准,其他版本安装方式是类似的。

一、创建Nginx和PHP专用的用户和用户组

代码如下 复制代码
1.[root@localhost /]# groupadd www
2.[root@localhost /]# useradd -s /sbin/nologin -M -g www www

二、PHP与PHP-FPM的安装及优化
PHP-FPM是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候需要和PHP源码一起编译。因为Nginx是一个轻量级的HTTP Server,必须借助第三方的FastCGI处理器才可以对PHP进行解析。

1. 首先下载并安装PHP的依赖

代码如下 复制代码
1.# 下载libmcrypt,有两个文件
2.[root@localhost downloads]# wget -c "http://downloads.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz?ts=1347243907&use_mirror=ncu"
3.[root@localhost downloads]# wget -c "http://downloads.sourceforge.net/project/mcrypt/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz?r=&ts=1347244005&use_mirror=nchc"
4.# 下载libmhash
5.[root@localhost downloads]# wget -c "http://downloads.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.9.tar.bz2?ts=1347245105&use_mirror=ncu"
6.
7.# 首先安装libmcrypt
8.[root@localhost downloads]# tar zxvf libmcrypt-2.5.8.tar.gz
9.[root@localhost downloads]# cd libmcrypt-2.5.8
10.[root@localhost libmcrypt-2.5.8]# ./configure
11.[root@localhost libmcrypt-2.5.8]# make && make install
12.[root@localhost libmcrypt-2.5.8]# ldconfig
13.[root@localhost libltdl]# cd libltdl/
14.[root@localhost libltdl]# ./configure --enable-ltdl-install
15.[root@localhost libltdl]# make && make install
16.
17.# 接下来安装mhash,因为mcrypt需要mhash的依赖
18.[root@localhost libltdl]# cd ../../
19.[root@localhost downloads]# tar jxvf mhash-0.9.9.9.tar.bz2
20.[root@localhost downloads]# cd mhash-0.9.9.9
21.[root@localhost mhash-0.9.9.9]# ./configure
22.[root@localhost mhash-0.9.9.9]# make && make install
23.
24.# 最后安装mcrypt
25.[root@localhost mhash-0.9.9.9]# cd ..
26.[root@localhost downloads]# tar xzxvf mcrypt-2.6.8.tar.gz
27.[root@localhost downloads]# cd mcrypt-2.6.8
28.# 将mhash加入ld library路径中
29.[root@localhost mcrypt-2.6.8]# export LD_LIBRARY_PATH=/usr/local/lib
30.[root@localhost mcrypt-2.6.8]# ldconfig
31.[root@localhost mcrypt-2.6.8]# ./configure
32.[root@localhost mcrypt-2.6.8]# make && make install
33.[root@localhost mcrypt-2.6.8]# cd ..

2. 下载PHP和对应版本的PHP-FPM

代码如下 复制代码
1.[root@localhost downloads]# wget -c http://www.php.net/get/php-5.2.17.tar.gz/from/this/mirror
2.# 在http://php-fpm.org/downloads目录下选择与安装php版本一致的PHP-FPM,否则会引起兼容性问题
3.[root@localhost downloads]# wget -c http://php-fpm.org/downloads/php-5.2.17-fpm-0.5.14.diff.gz
4.# 如果是5.2.x的版本的话,还需要下载PHP Hash冲突的补丁,5.3+不需要下载了
5.[root@localhost downloads]# wget -c https://github.com/laruence/laruence.github.com/raw/master/php-5.2-max-input-vars/php-5.2.17-max-input-vars.patch

3. 安装PHP、PHP-FPM和对应的补丁

代码如下 复制代码

[root@localhost downloads]# tar xzvf php-5.2.17.tar.gz
# 将php-fpm以补丁的形式写入到php源码中
[root@localhost downloads]# gzip -cd php-5.2.17-fpm-0.5.14.diff.gz | patch -d php-5.2.17 -p1
# 写入hash冲突补丁,php 5.3+不需要
[root@localhost downloads]# patch -d php-5.2.17 -p1 < php-5.2.17-max-input-vars.patch
[root@localhost downloads]# cd php-5.2.17
# 这里将php安装到/usr/local/php目录下面,引用的mysql安装目录为/usr/local/mysql,这里需要根据实际情况进行修改
[root@localhost php-5.2.17]# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --with-xmlrpc --enable-zip --enable-soap
# 如果出现 Thank you for using PHP. 的时候说明配置成功,否则根据出现的错误安装对应的依赖库
[root@localhost php-5.2.17]# make ZEND_EXTRA_LIBS='-liconv'
[root@localhost php-5.2.17]# make install
# 如果是php5.2.17的话,安装了hash冲突补丁之后显示的版本是 PHP 5.2.17p1
# 拷贝默认的php配置文件
[root@localhost php-5.2.17]# cp php.ini-dist /usr/local/php/etc/php.ini
[root@localhost php-5.2.17]# cd ..

4. 编译安装PHP的扩展模块(根据实际情况选择)

代码如下 复制代码
1.# 设置php的根目录,注意切换为实际的php目录
2.[root@localhost downloads]# export PHP_HOME="/usr/local/php"
3.
4.# 安装pdo_mysql
5.[root@localhost downloads]# wget -c http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
6.[root@localhost downloads]# tar zxvf PDO_MYSQL-1.0.2.tgz
7.[root@localhost downloads]# cd PDO_MYSQL-1.0.2
8.# 注意切换为实际的mysql目录
9.[root@localhost PDO_MYSQL-1.0.2]# $PHP_HOME/bin/phpize
10.[root@localhost PDO_MYSQL-1.0.2]# ./configure --with-php-config=$PHP_HOME/bin/php-config --with-pdo-mysql=/usr/local/mysql
11.[root@localhost PDO_MYSQL-1.0.2]# make && make install
12.[root@localhost PDO_MYSQL-1.0.2]# cd ..
13.
14.# 安装eAccelerator
15.[root@localhost downloads]# wget -c https://github.com/downloads/eaccelerator/eaccelerator/eaccelerator-0.9.6.1.tar.bz2
16.[root@localhost downloads]# tar jxvf eaccelerator-0.9.6.1.tar.bz2
17.[root@localhost downloads]# cd eaccelerator-0.9.6.1
18.[root@localhost eaccelerator-0.9.6.1]# $PHP_HOME/bin/phpize
19.[root@localhost eaccelerator-0.9.6.1]# ./configure --enable-shared --with-php-config=$PHP_HOME/bin/php-config
20.[root@localhost eaccelerator-0.9.6.1]# make && make install
21.[root@localhost eaccelerator-0.9.6.1]# cd ..

接下来修改php.ini文件来启用安装的第三方模块

代码如下 复制代码
1.# 打开php.ini,查找extension_dir
2.[root@localhost downloads]# vim $PHP_HOME/etc/php.ini
3.# 将extension_dir设置为新的目录/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
4.extension_dir="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
5.# 增加扩展
6.extension=eaccelerator.so
7.extension=pdo_mysql.so
8.## ------- 按shift+g键跳到配置文件的最末尾,加上eaccelerator配置信息:
9.[eaccelerator]
10.# 共享内存,单位为M
11.eaccelerator.shm_size="32"
12.eaccelerator.cache_dir="/tmp/eaccelerator"
13.eaccelerator.enable="1"
14.eaccelerator.optimizer="1"
15.eaccelerator.check_mtime="1"
16.eaccelerator.debug="0"
17.eaccelerator.filter=""
18.eaccelerator.shm_ttl="0"
19.eaccelerator.shm_prune_period="0"
20.eaccelerator.shm_only="0"
21.
22.[root@localhost downloads]# mkdir /tmp/eaccelerator
23.[root@localhost downloads]# chmod 777 /tmp/eaccelerator
24.# 这个时候运行php应该可以看到eaccelerator已经加载成功
25.[root@localhost downloads]# $PHP_HOME/bin/php -version
26.PHP 5.2.17p1 (cli) (built: Sep 10 2012 18:41:32)
27.Copyright (c) 1997-2010 The PHP Group
28.Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
29. with eAccelerator v0.9.6.1, Copyright (c) 2004-2010 eAccelerator, by eAccelerator

5. 配置与优化PHP-FPM
PHP-FPM默认的配置文件在$PHP_HOME/etc/php-fpm.conf中,下面对常用的配置项进行说明:

1. 127.0.0.1:9000 用来配置FastCGI进程监听的IP地址以及端口,默认为127.0.0.1:9000
2. 0 用来配置是否显示PHP错误信息,默认是0不显示,设置为1显示信息
3. wwwwww用来设置运行FastCGI进程的用户和用户组。这里指定的用户和用户组必须和Nginx配置文件中指定的一致。
4. 128用于设置FastCGI的进程数。根据官方建议,小于2G内存的服务器可以只开启64个进程,4GB以上内存服务器可以开始256个进程。
5. 0s执行脚本的时间,默认为0表示无限执行下去。
6. 65535设置PHP-FPM对打开文件描述符的限制,默认为1024。该值必须和Linux内核打开文件数关联起来,如将该值设置为65535就必须在Linux命令行中执行 ulimit -HSn 65535。
7. 1024设定每个children最多处理多少个请求后便会自动关闭,默认设置为500。
8. 127.0.0.1 设置允许访问FastCGI进程解析器的IP地址,如果不在这里指定IP地址,将无法接受Nginx转发过来的PHP解析请求。
6. 启动FastCGI进程

1.[root@localhost /]# ulimit -SHn 65535
2.# start为启动,reload可以在进程不中断的情况下重新加载php.ini配置信息
3.[root@localhost /]# /usr/local/php/sbin/php-fpm start
其中php-fpm除了start之外还有很多参数,如stop为强制终止、quit为平滑终止、restart重启进程、reload为在不终止php的情况下重新加载php的配置文件php.ini。

三、安装Nginx
1. 首先安装Nginx所需的pcre-devel库

安装pcre库的目的是为了让Nginx支持HTTP rewrite模块。安装很简单,过程如下:

1.# 下载安装最新的pcre库

代码如下 复制代码
2.[root@localhost downloads]# wget -c ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.31.tar.gz
3.[root@localhost downloads]# tar xzvf pcre-8.31.tar.gz
4.[root@localhost downloads]# cd pcre-8.31
5.[root@localhost pcre-8.31]# ./configure
6.[root@localhost pcre-8.31]# make && make install
7.[root@localhost pcre-8.31]# cd ..

2. 安装TCMalloc提升Nginx性能(可选)

TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员。与标准的glibc库的Malloc相比,TCMalloc库在内存分配效率和速度上要高很多。

如果是64位系统的话首先需要安装libunwind库,32位系统不需要安装。

代码如下 复制代码
1.[root@localhost downloads]# wget -c http://download.savannah.gnu.org/releases/libunwind/libunwind-1.0.1.tar.gz
2.[root@localhost downloads]# tar xzvf libunwind-1.0.1.tar.gz
3.[root@localhost downloads]# cd libunwind-1.0.1
4.[root@localhost libunwind-1.0.1]# CFLAGS=-fPIC ./configure
5.[root@localhost libunwind-1.0.1]# make CFLAGS=-fPIC
6.[root@localhost libunwind-1.0.1]# make CFLAGS=-fPIC install
7.[root@localhost libunwind-1.0.1]# cd ..

然后安装google-perftools,可以从https://code.google.com/p/gperftools/downloads/list下载。

代码如下 复制代码
1.[root@localhost downloads]# wget -c https://gperftools.googlecode.com/files/gperftools-2.0.tar.gz
2.[root@localhost downloads]# tar xzvf gperftools-2.0.tar.gz
3.[root@localhost downloads]# cd gperftools-2.0
4.[root@localhost gperftools-2.0]# ./configure
5.[root@localhost gperftools-2.0]# make && make install
6.[root@localhost gperftools-2.0]# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
7.[root@localhost gperftools-2.0]# ldconfig

3. 安装Nginx

代码如下 复制代码
1.[root@localhost downloads]# wget -c http://nginx.org/download/nginx-1.2.3.tar.gz
2.[root@localhost downloads]# tar xzvf nginx-1.2.3.tar.gz
3.[root@localhost downloads]# cd nginx-1.2.3
4.[root@localhost nginx-1.2.3]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-google_perftools_module
5.[root@localhost nginx-1.2.3]# make && make install

相对来说Nginx的安装也比较简单,在默认情况下,经过编译安装的Nginx包含了大部分可用的模块。可以通过“./configure --help”选项来查看各个配置项的信息,也可以查看Nginx官方文档 http://nginx.org/en/docs/install.html。

下面是几个常用的配置项:


--prefix 安装目录,默认为/usr/local/nginx
--user和--group 用来指定允许的用户和组
--with-http_stub_status_module 该模块可以启用Nginx的NginxStatus功能,来监控Nginx的当前状态
--with-http_ssl_module 支持SSL
--with-google_perftools_module 支持TCMalloc,如果前面安装了该模块选择该项

4. 检查Nginx配置文件是否正确

1.# 通过以下命令检查配置文件是否正确

代码如下 复制代码
2.[root@localhost downloads]# /usr/local/nginx/sbin/nginx -t

如果一切正常的话会显示如下信息:

代码如下 复制代码

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

对于64位系统的话可能会出现类似下面的信息:

代码如下 复制代码

/usr/local/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

这个时候可以通过如下命令检查nginx缺少的依赖:

代码如下 复制代码
1. [root@localhost downloads]# ldd /usr/local/nginx/sbin/nginx
2. /usr/local/nginx/sbin/nginx:
3. libpthread.so.0 => /lib64/libpthread.so.0 (0x000000375a000000)
4. libcrypt.so.1 => /lib64/libcrypt.so.1 (0x000000375bc00000)
5. libpcre.so.1 => /lib64/libpcre.so.1 (0x0000003759c00000)
6. libssl.so.6 => /lib64/libssl.so.6 (0x000000375e000000)
7. libcrypto.so.6 => /lib64/libcrypto.so.6 (0x000000375d000000)
8. libdl.so.2 => /lib64/libdl.so.2 (0x00002adbfb645000)
9. libz.so.1 => /lib64/libz.so.1 (0x000000375b000000)
10. libpcre.so.1 => not found
11. libprofiler.so.0 => not found
12. libunwind.so.8 => not found
13. libc.so.6 => /lib64/libc.so.6 (0x0000003759800000)
14. /lib64/ld-linux-x86-64.so.2 (0x0000003759400000)
15. libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x000000375d800000)
16. libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x000000375f800000)
17. libcom_err.so.2 => /lib64/libcom_err.so.2 (0x000000375dc00000)
18. libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x000000375f400000)
19. libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x000000375fc00000)
20. libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x000000375cc00000)
21. libresolv.so.2 => /lib64/libresolv.so.2 (0x000000375c800000)
22. libselinux.so.1 => /lib64/libselinux.so.1 (0x000000375ac00000)
23. libsepol.so.1 => /lib64/libsepol.so.1 (0x000000375a800000)

对于出现not found的依赖可以首先通过whereis查询所在的位置,然后通过ln建立链接到/lib64/目录下面:

代码如下 复制代码
1.[root@localhost downloads]# ln -s /lib64/libpcre.so.0.0.1 /lib64/libpcre.so.1
2.[root@localhost downloads]# ln -s /usr/local/lib/libprofiler.so /lib64/libprofiler.so.0
3.[root@localhost downloads]# ln -s /usr/local/lib/libunwind.so /lib64/libunwind.so.8

5. Ngnix的启动、停止和平滑重启

1.# 启动Nginx
2.[root@localhost downloads]# /usr/local/nginx/sbin/nginx
3.# 使用下面命令查看是否启动成功
4.[root@localhost downloads]# ps -ef | grep nginx
5.# 关闭Nginx使用kill pid,其中pid存放在nginx安装目录的 logs/nginx.pid下面,可以使用下面的方法直接关闭
6.[root@localhost downloads]# kill `cat /usr/local/nginx/logs/nginx.pid`
7.# 然后查看是否有nginx的进程
8.[root@localhost downloads]# ps -ef | grep nginx
9.# 平滑切换Nginx,0.8.x及以上版本可以直接使用-s reload方法
10.[root@localhost downloads]# /usr/local/nginx/sbin/nginx -s reload
6. 启用TCMalloc(可选)

代码如下 复制代码
1.# 创建一个线程目录,将文件放在/tmp/tcmalloc下面
2.[root@localhost downloads]# mkdir /tmp/tcmalloc
3.[root@localhost downloads]# chmod 777 /tmp/tcmalloc
4.# 修改nginx.conf配置文件,在pid这行下面添加配置如下信息
5.[root@localhost downloads]# vim /usr/local/nginx/conf/nginx.conf
6.google_perftools_profiles /tmp/tcmalloc;
7.# 重启nginx
8.[root@localhost downloads]# /usr/local/nginx/sbin/nginx -s reload
9.[root@localhost downloads]# lsof -n | grep tcmalloc

7. 自动切割Nginx的日志文件
Nginx自身没有日志切割的功能,如果时间长的话日志文件会很大,可以使用下面的脚本实现日志文件自动每天进行切割:

代码如下 复制代码
1. #!/bin/bash
2.
3. # The Nginx logs path
4. nglogs='/usr/local/nginx/logs'
5.
6. mkdir -p ${nglogs}/$(date +%Y)/$(date +%m)
7. mv ${nglogs}/access.log ${nglogs}/$(date +%Y)/$(date +%m)/access.$(date +%Y%m%d).log
8. mv ${nglogs}/error.log ${nglogs}/$(date +%Y)/$(date +%m)/error.$(date +%Y%m%d).log
9. kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

以上文件保存在/usr/local/nginx/sbin/cutlogs.sh中,然后修改执行权限并添加到任务中

代码如下 复制代码

1.[root@localhost ~]# chmod +x /usr/local/nginx/sbin/cutlogs.sh
2.[root@localhost ~]# crontab -l > tmpcrontab
3.[root@localhost ~]# echo "00 00 * * * /bin/bash /usr/local/nginx/sbin/cutlogs.sh" >> tmpcrontab
4.[root@localhost ~]# crontab tmpcrontab
5.[root@localhost ~]# rm -f tmpcrontab

四、将Nginx和php-fpm加入到开机启动

代码如下 复制代码

[root@localhost downloads]# cat >> /etc/rc.local < > /etc/init.d/mysql start
> ulimit -SHn 65535
> /usr/local/php/sbin/php-fpm start
> /usr/local/nginx/sbin/nginx
> EOF

相关文章

精彩推荐