您的位置:首页 > 运维架构 > Linux

CentOS 6.2 LNMP 环境搭建优化笔记

2015-12-14 13:54 671 查看
首先从centos 官方下载DVD镜像:

安装的时候才用文本安装模式:

文本安装模式的进入方法:

当出现选择菜单时:按ESC,输入 linux text 回车进入文本安装模式。

文本安装模式下centos为了弥补某些bug,所以不支持手动分区,默认就可以了。(以下介绍部分为转载)

系统安装教程:CentOS 6.2安装(超级详细图解教程): http://www.osyunwei.com/archives/1537.html

一、配置好IP、DNS 、网关,确保使用远程连接工具能够连接服务器
CentOS 设置IP地址、网关、DNS教程:http://www.osyunwei.com/archives/423.html

朋友们对LAMP架构应该比较熟悉了,Linux+Apache+Mysql+Php/perl/python),LNMP架构只是把提供web服务的Apache改用为Nginx。从而形成,Linux+Nginx+Mysql+Php/perl/python)架构。目前企业级别应用Nginx在创下许多惊人战绩。

目前国内以张宴为代表,掀起了nginx的狂潮,首先简单介绍下什么是nginx.

Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx。

为什么Nginx的性能要比Apache高得多?

这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。
处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效。

Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性:

作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue 作为开发模型.

Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多. 。Nginx可作为7层负载均衡服务器来使用。

作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验.

Nginx 是一个安装非常的简单 , 配置文件非常简洁(还能够支持perl语法), Bugs 非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级 .

总体来说nginx的有以下八大优点:

1.高并发连接:官方测试能支撑5万并发连接,在实际生产环境中跑到2,~3W并发连接。

2.内存消耗少:在3W并发连接下,开启的10个NGINX进程才消耗150M内存(15M*10=150M)

3.配置文件非常简单:风格跟程序一样通俗易懂。

4.成本低廉:Nginx作为开源软件,可以免费使用,而购买F5 BIG-IP、NetScaler

等硬件负载均衡交换机则需要十多万至几十万人民币。

5.支持rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分发到不同的后端服务器群组。

6.内置的健康检查功能:如果Nginx Proxy后端的后台web服务器宕机了,不会音响前端访问。

7.节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头。

8.稳定性高:用于反向代理,宕机的概率微乎其微。

介绍这么多nginx 的优点.下面来具体实现下LEMP架构(linux+nginx+mysql+php/perl/python)

可能有朋友对静态动态解析过程不太清楚,笔者按照自己理解简单阐述,如有错误地方请前辈多加指点。

nginx只是提供一个静态web服务,动态web服务还需要与PHP等脚本语言结合使用。如图所示:



客户端在访问动态页面时,因为apache和nginx只能提供静态解析,这是他们通过内置的cgi接口去寻找php等脚本语言,当需要用到数据部分时PHP会去调用后台MYSQL数据库中的数据,之后通过解析生成静态页面在返回apache/nginx服务器,再由此交付给客户端。

如果不清楚CGI和fastCGI笔者作以下简要说明:

Perl、Python或者PHP原来在Web开发的时候应用得比较多,因为早期的web服务器(当然还包括Apache)内建了CGI(通用网关接口)接口。CGI能够以确定的方式让Web服务器在客户机的浏览器和外部应用程序之间交换数据。通过支持外部的、基于CGI的应用程序,Web开发人员能够引进动态要素。使用这种接口开发经过编译的应用程序相对来说比较复杂,但是,这种解释性的语言通常包括这种功能,或者是直接包括这种功能(如使用PHP),或者通过标准模块包括这种功能(如使用Perl和Python)。

FastCGI同CGI一样是一个WEB服务器与外部程序接口的标准,它是为解决CGI的性能问题而开发的一种技术。

CGI技术的性能缺陷:每当服务器收到一个对CGI程序请求时,服务器都将创建一个CGI程序的进程,CGI程序处理完请求后,将输出发给服务器或直接传回客户端,然后终止。

fastCGI对CGI技术进行了改良,一个fastCGI进程在WEB服务器启动时或在客户端第一次请求时创建,它处理完客户端请求后并不终止,而是等待处理下一个请求。另外fastCGI程序与CGI程序与服务器的交互方式也不同,CGI程序通过环境变量、命令行、标准输入输出进行交互,因此CGI程序进程必须与服务器进程在同一台物理计算机上,而fastCGI程序与服务器进程通过网络连接交互,因此fastCGI程序可以分布在不同的计算机上,这不但可以提高性能,同时也提高了系统的扩展能力。

下面开始手动编译LNMP生产环境的过程:

首先,下载nginx:地址:http://nginx.org/en/download.html 最新的稳定版为,1.2.1

然后,下载mysql,这里mysql我们采用mysql原作者,最新开发的mysql分之数据库,mariaDB,作者对其进行了全面优化,并且完全兼容mysql。

http://downloads.mariadb.org/mariadb/ 其最新稳定版为:5.5.25

最后,下载PHP程序,地址:http://www.php.net/archive/2012.php#id2012-06-14-1 其最新稳定版为:5.4.4

简单介绍所用包的关系以及原理(此处介绍为转载)

1.mysql-5.5.3-m3.tar.gz #LEMP架构中担当数据库服务器即M

2.Nginx-0.7.65.tar.gz #提供web服务,提供静态web服务

3.php5.3.3.tar.bz2 #提供php脚本语言用来解析动态页面

需要说明以下几点:

php在编译安装时,nginx要想能够调用php提供动态php格式的网页,必须用FastCGI来实现,但FastCGI只是一个框架,实现FastCGI框架的有PHP-FPM,但对于5.2.x版本的php来说 默认是不支持PHP-FPM的,需要打上php-fpm的补丁,对于5.3.2之前版本的也是需要打补丁的,而且打补丁的过程比较麻烦。好在5.3.3版本的PHP-FPM被直接做进了源代码包中,在编译安装时只需启用PHP-FPM功能即可,笔者为了简要实现功能,选用5.3.3版本来进行演示。

但如果要使用PHP-FPM的话,还需要提供以下几个功能:

a.需要提供可以解析xml格式的文档,需要安装libxml2 和libxml2-devel这两个包,好在这两个包在安装完开发环境后这两个包是默认安装过的。

b.需要安装libevent并且在1.4.12之后的版本,不幸的是rhel5.4版本中这个包是是在1.4.12之前的,需要从新手动编译安装该包。

c. libiconv 用来提供网络连接方式的功能组件,可以实现更快速的网络访问,这个组件系统上是没有装的,需要手动编译安装。

下面开始正式的编译安装过程:

用wget 命令,把所需要的源码包,下载到你习惯放置的目录:

使用 tar zxvf/jxvf 命令,把源码包,解压缩到本地目录:

使用yum 命令,安装一些常用的软件依赖关系包文件:

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers

yum -y install ntp vim-enhanced gcc gcc-c++ gcc-g77 flex bison autoconf automake glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel libtool* zlib-devel libxml2-devel libjpeg-devel libpng-devel libtiff-devel fontconfig-devel freetype-devel libXpm-devel gettext-devel curl curl-devel pam-devel e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers gzip

yum install make apr* autoconf automake curl curl-devel gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel gd kernel keyutils patch perl kernel-headers compat* mpfr cpp glibc libgomp libstdc++-devel ppl cloog-ppl keyutils-libs-devel libcom_err-devel libsepol-devel libselinux-devel krb5-devel zlib-devel libXpm* freetype libjpeg* libpng* php-common php-gd ncurses* libtool* libxml2 libxml2-devel patch

安装上面的所有包之后,估计你以后编译软件,不会再报依赖包不足的问题啦,嘿嘿!

编译nginx:

进入nginx解压缩好的目录:

执行:./configure --prefix=/usr/local/nginx --pid-path=/var/nginx/nginx.pid --lock-path=/var/nginx/nginx.lock --with-http_gzip_static_module --http-client-body-temp-path=/var/nginx/client/ --http-proxy-temp-path=/var/nginx/proxy/ --http-fastcgi-temp-path=/var/nginx/fcgi/ --with-http_stub_status_module --error-log-path=/var/nginx/error.log --http-log-path=/var/nginx/access.log --with-http_ssl_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_perl_module --with-mail --with-mail_ssl_module --user=www --group=www

如果没有报错,就执行make && make install

期间我报了一个错误,还是由于依赖包不足造成的, ̄□ ̄||

执行:yum install perl-ExtUtils-Embed 解决。

为nginx运行单独创建一个用户www:

groupadd www

useradd –g www www -s /sbin/nologin -M # 添加一个不能登录的且没有家目录 名为nginx的用户

编译安装完成后为了让nginx开机启动,需要创建一个脚本:

vim /etc/init.d/nginxd

输入以下内容:

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx

#下面几个配置文件的目录需要注意一下,如果你的安装目录与我的不同,请手动修改下面的配置。
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`www -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

保存退出 并给/etc/init.d/nginxd 赋予执行权限

chmod +x /etc/init.d/nginxd

chkconfig --add nginxd ##让入开机启动选项中

chkconfig nginxd on #让其开机自动启动

service nginxd start #立即启动nginx 服务

现在你就可以访问你的主机80端口了,记得添加防火墙iptables规则,或者关闭防火墙。

二、配置防火墙,开启80端口、3306端口

vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT(允许80端口通过防火墙)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT(允许3306端口通过防火墙)

特别提示:很多网友把这两条规则添加到防火墙配置的最后一行,导致防火墙启动失败

正确的应该是添加到默认的22端口这条规则的下面,添加好之后防火墙规则如下所示:

#########################################################
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
#########################################################

/etc/init.d/iptables restart #最后重启防火墙使配置生效

对了,记得关闭selinux,否则白白浪费系统10%的资源。

三、关闭SELINUX
vi /etc/selinux/config #编辑
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq #保存退出
shutdown -r now #重启系统

如果不想重启系统,使用命令setenforce 0
注:
setenforce 1 设置SELinux 成为enforcing模式
setenforce 0 设置SELinux 成为permissive模式
在lilo或者grub的启动参数中增加:selinux=0,也可以关闭selinux
#---------------------------------------------------------------
查看selinux状态:
/usr/bin/setstatus -v
如下:
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: enforcing
Policy version: 21
Policy from config file: targeted
getenforce/setenforce查看和设置SELinux的当前工作模式。

下面进行编译安装mariaDB:

以前mysql编译的时候,使用的是./configure命令,不过自从5.2的版本之后,开始引入了cmake的编译方法:

具体的编译参数对照表,请访问以下地址:http://forge.mysql.com/wiki/Autotools_to_CMake_Transition_Guide#Storage_Engine_Options

下载cmake(MySQL编译工具)

http://www.cmake.org/files/v2.8/cmake-2.8.8.tar.gz

安装cmake
cd /usr/local/src
tar zxvf cmake-2.8.8.tar.gz
cd cmake-2.8.8
./configure

gmake
make && make install

首先进入mariaDB的解压缩目录:

执行命令:

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_UNIX_ADDR=/usr/local/mysql/tmp/mysql.sock -DEXTRA_CHARSETS=all -DWITH_DEBUG=0 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DENABLED_LOCAL_INFILE=1 -DWITH_SSL=system -DWITH_READLINE=1 -DWITH_EMBEDDED_SERVER=1 -DWITH_XTRADB_STORAGE_ENGINE=1

然后:make && make install

groupadd mysql #添加mysql组
useradd -g mysql mysql -s /sbin/nologin #创建用户mysql并加入到mysql组,不允许mysql用户直接登录系统。

chown -R mysql:mysql /usr/local/mysql #设置MySQL数据库目录权限

cd /usr/local/mysql

cp ./support-files/my-innodb-heavy-4G.cnf /etc/my.cnf #拷贝配置文件(注意:如果/etc目录下面默认有一个my.cnf,直接覆盖即可)

./scripts/mysql_install_db --user=mysql #生成mysql系统数据库

cp ./support-files/mysql.server /usr/local/mysql/mysqld #把Mysql加入系统启动

ln -s /usr/local/mysql/mysqld /etc/rc.d/init.d/mysqld

chmod 755 ./mysqld #增加执行权限

chkconfig --add mysqld
chkconfig mysqld on #设置开机启动

vi /etc/profile #把mysql服务加入系统环境变量:在最后添加下面这一行
export PATH=$PATH:/usr/local/mysql/bin

source /etc/profile #使设置生效。

ldconfig

下面这两行把myslq的库文件链接到系统默认的位置,在编译类似PHP等软件时可以不用指定mysql的库文件地址。
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
ln -s /usr/local/mysql/include/mysql /usr/include/mysql
shutdown -r now #需要重启系统,等待系统重新启动之后继续在终端命令行下面操作
mysql_secure_installation #设置Mysql密码
根据提示按Y 回车
然后输入2次密码
继续按Y 回车,直到设置完成
或者直接修改密码/usr/local/mysql/bin/mysqladmin -u root –p (空) password "123456" #修改密码
service mysqld restart #重启
到此,mysql安装完成!

PHP(下面开始编译安装PHP支持环境)

解压缩php程序,到你喜欢使用的目录。

CD进入php解压缩后的目录,执行./configure 预编译命令如下:

./configure --prefix=/usr/local/php --enable-fpm --with-mcrypt --with-zlib --enable-mbstring --with-curl --disable-debug --with-pic --enable-inline-optimization --with-bz2 --enable-xml --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-fpm-user=php --with-fpm-group=php --enable-pdo --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-openssl --with-imap-ssl --with-freetype-dir --with-jpeg-dir --with-png-dir --enable-bcmath --enable-shmop --with-curlwrappers -enable-force-cgi-redirect --with-gd --enable-gd-native-ttf --with-ldap --with-ldap-sasl --enable-ftp --without-iconv --with-libXML-dir --with-XMLrpc --with-curlwrappers --with-xsl --with-gettext --with-gettext --with-pear --enable-calendar --enable-bcmath --enable-exif --enable-magic-quotes --with-gmp --with-gdbm --enable-sigchild --enable-sysvsem --enable-sysvshm --enable-zend-multibyte --enable-wddx --enable-shmop --enable-soap --with-config-file-path=/usr/local/PHP/etc

#需要说明两点 1.--with-mysql和--with-mysqli的路径是你mysql的具体所在的目录

2.--enable-fpm 启动fpm .其他都是些基本选项 ,简单易懂,如果要求php支持的功能不多可以精简这些参数,后者后期添加。

出现以下画面表示编译成功





在预编译的过程中,我出现了如下错误,附上解决方法:

configure: error: DBA: Could not find necessary header file(s).

解决方法:yum install gdbm-devel db4-devel

configure: error: Unable to locate gmp.h

解决方法:yum install gmp-devel

configure: error: Cannot find ldap libraries in /usr/lib

解决方法:cp -frp /usr/lib64/libldap* /usr/lib/

configure: error: mcrypt.h not found. Please reinstall libmcrypt

解决方法:

wget http://pkgs.repoforge.org/libmcrypt/libmcrypt-2.5.7-1.2.el6.rf.x86_64.rpm

rpm -ivh ./libmcrypt-2.5.7-1.2.el6.rf.x86_64.rpm

wget http://pkgs.repoforge.org/libmcrypt/libmcrypt-devel-2.5.7-1.2.el6.rf.x86_64.rpm

rpm -ivh ./libmcrypt-devel-2.5.7-1.2.el6.rf.x86_64.rpm

由于上面这两个包,yum库里面没有对应的安装文件,所以我们只能采用rpm方式,自己下载安装,下载地址为:

http://pkgs.repoforge.org/libmcrypt/

以后如果库里面加入了支持文件,可以yum安装,就执行:yum install libmcrypt libmcrypt-devel

configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution

解决方法:yum install libxslt.x86_64 libxslt-devel.x86_64

最后整一个: yum updata;

最后有几个不是别的参数,可能是php版本更新的问题,以后编译安装的时候,可以去掉。

configure: WARNING: unrecognized options: --enable-force-cgi-redirect, --with-libXML-dir, --with-XMLrpc, --enable-magic-quotes, --enable-zend-multibyte

预编译到此完成。下面执行,make && make install 完成我们的安装过程。(make clean,make distclean)

cp ./php.ini-production /usr/local/php/etc/php.ini

#复制php配置文件到安装目录

rm -rf /etc/php.ini #删除系统自带配置文件
ln -s /usr/local/php/etc/php.ini /etc/php.ini #添加软链接
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf #拷贝模板文件为php-fpm配置文件

首先修改下面来配置修改 /usr/local/php/etc/php-fpm.conf

vim /usr/local/php/etc/php-fpm.conf
user = php #设置php-fpm运行账号为php
group = php #设置php-fpm运行组为php
pid = run/php-fpm.pid #取消前面的分号

该配置文件只用修改以下四点

; Note: Used when pm is set to either 'static' or 'dynamic'
; Note: This value is mandatory.
pm.max_children = 50

; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 10

; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 5

; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 35

cp ./sapi/fpm/init.d.php-fpm /usr/local/php/php-fpm #设置 php-fpm开机启动,链接php-fpm到启动目录

ln -s /usr/local/php/php-fpm /etc/rc.d/init.d/php-fpm

chmod +x /usr/local/php/php-fpm #添加执行权限

chkconfig --add php-fpm
chkconfig php-fpm on #设置开机启动
vim /usr/local/php/etc/php.ini #编辑配置文件
找到:disable_functions =
修改为:disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname
#列出PHP可以禁用的函数,如果某些程序需要用到这个函数,可以删除,取消禁用。
找到:;date.timezone =
修改为:date.timezone = Asia/Shanghai #设置时区
找到:expose_php = On
修改为:expose_php = OFF #禁止显示php版本的信息。

之后配置nginx支持PHP程序:

配置fastcgi_params 文件

cd /etc/nginx/

vim fastcgi_params

将里面内容替换为

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

保存退出

配置nginx.conf文件:

vim /usr/local/nginx/conf/nginx.conf #编辑配置文件
user www www; #首行user去掉注释,修改Nginx运行组为www www;必须与/usr/local/php/etc/php-fpm.conf中的user,group配置相同,否则php运行出错
index index.php index.html index.htm; #添加index.php
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#取消FastCGI server部分location的注释,并要注意fastcgi_param行的参数,改为$document_root$fastcgi_script_name,或者使用绝对路径
service nginxd restart #重启nginx

之后编辑/nginx/html/index.php

在其中添加

<?php
phpinfo();
?>

保存退出

之后用web浏览器访问 如果出现phpinfo画面 表示服务成功,并能连接到php。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: