Ubuntu下安装Nginx + PHP-FPM +MySQL
本文主要参考http://interfacelab.com/nginx-php-fpm-apc-awesome/,部分地方有改动。
Nginx
Nginx一定比Apache好吗?也不能这么说,各有各的优点。
PHP-FPM?
有些人或许会喜欢用Lighttpd中的spawn-fcgi,其实php-fpm比它更优越,详细介绍:http://syre.blogbus.com/logs/20092011.html
Let's go !
我正在使用新的Ubuntu 9.10, 如果你使用的是CentOS,也只需稍微修改一下即可。
第一件事首先,我们安装所有依赖:
sudo apt-get install make bison flex gcc patch autoconf subversion locate sudo apt-get install libxml2-dev libbz2-dev libpcre3-dev libssl-dev zlib1g-dev libmcrypt-dev libmhash-dev libmhash2 libcurl4-openssl-dev libpq-dev libpq5 libsyck0-dev
万事俱备,只欠东风。
安装MySQL
由于MySQL源码编译很耗时间,于是采用二进制包安装,方便快捷。
sudo apt-get install mysql-server
然后用新立得软件管理器再安装一个包
libmysqlclient15-dev,用于下面安装支持php连接mysqli。
编译PHP
我们将下载的PHP 5.3.0源,以及PHP的补丁,php-5.3.0-fpm。 然后,我们将给php打上补丁并编译。
cd /usr/local/src/ sudo wget http://cn.php.net/get/php-5.3.0.tar.bz2/from/cn2.php.net/mirror sudo tar jxvf php-5.3.0.tar.bz2 sudo wget http://php-fpm.org/downloads/php-5.3.0-fpm-0.5.12.diff.gz sudo gzip -cd php-5.3.0-fpm-0.5.12.diff.gz | sudo patch -d php-5.3.0 -p1 cd php-5.3.0/ sudo ./configure --enable-fastcgi --enable-force-cgi-redirect --enable-fpm --with-mysql=/usr/bin/mysql --with-mysqli=/usr/bin/mysql_config --enable-session --disable-all sudo make all install sudo strip /usr/local/bin/php-cgi
以上编译参数可能不适用于正式环境,我为了避免安装一些不必要的包,而精简了编译参数。如果需要安装额外的包,重新编译php也不是很耗时间。(当然,如果你手头上管理几十台机器以上的,不建议这么做,或许你可以尝试一下pecl)
复制php.ini:
sudo cp /usr/local/src/php-5.3.0/php.ini-production /usr/local/lib/php.ini
设置的符号链接,使东西更容易找到:
sudo mkdir /etc/php/ sudo ln -s /usr/local/lib/php.ini /etc/php/php.ini sudo ln -s /usr/local/etc/php-fpm.conf /etc/php/php-fpm.conf
编辑/etc/php/php-fpm.conf
<value name="owner">www-data</value>
<value name="group">www-data</value>
#取消以下两行的注释,并修改
<value name="user">www-data</value>
<value name="group">www-data</value>
做完!
安装Nginx
cd .. sudo wget http://sysoev.ru/nginx/nginx-0.8.21.tar.gz sudo tar zxvf nginx-0.8.21.tar.gz sudo rm -f nginx-0.8.21.tar.gz cd nginx-0.8.21 sudo ./configure --sbin-path=/usr/local/sbin --with-http_ssl_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_stub_status_module sudo make && sudo make install
建立链接:
sudo ln -s /usr/local/nginx/conf /etc/nginx
设置Nginx:
user www-data;
worker_processes 6;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 10 10;
gzip on;
gzip_comp_level 1;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx_access.log main;
error_log /var/log/nginx_error.log debug;
include /usr/local/nginx/sites-enabled/*;
}
设置FastCGI的参数,让PHP不出现死进程,避免503 Nginx的错误。 打开/etc/nginx/fastcgi_params并加入以下内容:
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
最后创建一个Nginx启动的shell,新建一个文件/etc/init.d/nginx,输入以下代码:
#! /bin/sh
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/sbin/nginx
NAME=nginx
DESC=nginx
test -x $DAEMON || exit 0
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
. /etc/default/nginx
fi
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
--exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
--exec $DAEMON
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile \
/usr/local/nginx/logs/$NAME.pid --exec $DAEMON
sleep 1
start-stop-daemon --start --quiet --pidfile \
/usr/local/nginx/logs/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
--exec $DAEMON
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
不要忘记设置它可执行权限!
设置您的网站
sudo mkdir /usr/local/nginx/sites-enabled sudo ln -s /usr/local/nginx/sites-enabled /etc/sites
添加/etc/sites/default.conf为默认站点conf文件。 内容:
server {
listen *:80;
location / {
root /var/www/default/pub;
index index.php;
# if file exists return it right away
if (-f $request_filename) {
break;
}
# otherwise rewrite the fucker
if (!-e $request_filename) {
rewrite ^(.+)$ /index.php$1 last;
break;
}
}
# if the request starts with our frontcontroller, pass it on to fastcgi
location ~ ^/index.php
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/default/pub$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include /usr/local/nginx/conf/fastcgi_params;
}
}
启动Web Server
sudo php-fpm start sudo /etc/init.d/nginx start
EOF

刚接触nginx,跟apache相比,真麻烦啊。。。