在 VPS 上用 nginx + php-fpm + mysql 搭建网络服务

最近在折腾 VPS ,实在厌倦了每次配置时都要 google 一下,把配置步骤记录下来,也欢迎高手们指教。

我们需要参照这篇文章: http://blog.s135.com/nginx_php_v6/

准备

首先当然是要买一个 VPS ,新手推荐 YardVPS ,便宜啊。 然后在主机上建立存放安装包的目录:

mkdir ~/packa
cd ~/packa

下载安装包:

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.8.tar.gz/from/http://mysql.he.net/
wget http://nginx.org/download/nginx-0.8.54.tar.gz
wget http://cn.php.net/get/php-5.3.4.tar.bz2/from/us2.php.net/mirror
svn checkout http://code.taobao.org/svn/nginx_concat_module/trunk/ nginx_concat_module

安装 nginx

为了装逼,我们先修改一下 nginx 源码,使其发出的 Header 里的 server 信息带上我们自己的个性化烙印。

vim src/core/nginx.h

修改 #define NGINX_VER 这一行为你想要的! Like :

#define NGINX_VER "Peace in Heart (nginx/" NGINX_VERSION ")"

或者: http://stackoverflow.com/questions/246227/how-do-you-change-server-tag-for-nginx

根据 nginx 官方维基 的介绍以及自己的需求,使用如下编译选项:

  ./configure \
  --prefix=/usr/local/webserver/nginx \
  --user=www \
  --group=www \
  --conf-path=/etc/nginx/nginx.conf \
  --http-log-path=/srv/log/nginx/access_log \
  --error-log-path=/srv/log/nginx/error_log \
  --pid-path=/var/run/nginx.pid \
  --http-client-body-temp-path=/var/tmp/nginx/client \
  --http-proxy-temp-path=/var/tmp/nginx/proxy \
  --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
  --with-md5-asm \
  --with-sha1-asm \
  --with-sha1=/usr/include \
  --with-http_realip_module \
  --with-http_ssl_module \
  --with-http_flv_module \
  --with-http_gzip_static_module \
  --with-http_stub_status_module \
  --add-module=/root/packa/nginx_concat_module

如果要安装 perl 模块,则至少还需要 perl-ExtUtils-Embed perl-URI 。否则编译/运行时会报错。

add-module 那里添加的是淘宝的文件combo模块。详细了解请点此: http://code.taobao.org/project/view/59/

如果提示缺少倚赖(比如说 pcre ),安装相应软件包即可。比如 Ubuntu 下的 PCRE 是这样:

apt-get install libpcre3 libpcre3-dev

openssl 是这样:

apt-get install libssl-dev

用 yum 需要这些:

yum install pcre-devel perl-devel

其中 perl-devel 是如果你上面添加了 --with-http_perl_module 才有需要。

这些乱七八糟的发行版本,连软件包都没有一个统一的名字,还可真是麻烦啊。

然后就可以 make && make install

接下来就可以编辑 /etc/nginx/nginx.conf ,修改你的 nginx 配置了。

用 ArchLinux 编译的时候,一切都很顺,用 Ubuntu 就老是出错... 哎~ 其实这里有一个教程来着: http://forum.ubuntu.org.cn/viewtopic.php?t=241301

安装 php

php 编译选项如下

./configure \
 '--prefix=/usr/local/webserver/php'\
 '--sysconfdir=/etc/php'\
 '--localstatedir=/var'\
 '--with-layout=GNU'\
 '--with-config-file-path=/etc/php'\
 '--with-config-file-scan-dir=/etc/php/conf.d'\
 '--enable-inline-optimization'\
 '--disable-debug'\
 '--disable-rpath'\
 '--disable-static'\
 '--enable-shared'\
 '--mandir=/usr/share/man'\
 '--without-pear'\
 '--disable-cli'\
 '--enable-fpm'\
 '--with-fpm-user=www'\
 '--with-fpm-group=www'\
 '--enable-cli'\
 '--enable-mbregex'\
 '--enable-session'\
 '--enable-bcmath=shared'\
 '--enable-calendar=shared'\
 '--enable-exif=shared'\
 '--enable-ftp=shared'\
 '--enable-json=shared'\
 '--enable-mbstring=shared'\
 '--enable-pdo=shared'\
 '--enable-phar=shared'\
 '--enable-posix=shared'\
 '--enable-shmop=shared'\
 '--enable-soap=shared'\
 '--enable-sockets=shared'\
 '--enable-sysvmsg=shared'\
 '--enable-sysvsem=shared'\
 '--enable-sysvshm=shared'\
 '--enable-xml'\
 '--enable-zip=shared'\
 '--with-bz2=shared'\
 '--with-curl=shared'\
 '--with-freetype-dir=shared,/usr'\
 '--with-mcrypt=shared'\
 '--with-gd=shared'\
 '--enable-gd-native-ttf'\
 '--with-gettext=shared'\
 '--with-gmp=shared'\
 '--with-iconv=shared'\
 '--with-iconv-dir=/usr/local/lib'\
 '--with-imap-ssl=shared'\
 '--with-imap=shared'\
 '--with-kerberos'\
 '--with-jpeg-dir=shared,/usr'\
 '--with-ldap=shared'\
 '--with-ldap-sasl'\
 '--with-mhash'\
 '--with-mysql=shared,mysqlnd'\
 '--with-mysqli=shared,mysqlnd'\
 '--with-sqlite=shared'\
 '--with-pdo-mysql=shared,mysqlnd'\
 '--with-pdo-sqlite=shared'\
 '--with-openssl=shared'\
 '--with-pcre-regex=/usr'\
 '--with-png-dir=shared,/usr'\
 '--with-regex=php'\
 '--with-xmlrpc=shared'\
 '--with-zlib=shared'

make ZEND_EXTRA_LIBS='-liconv'

实现需要安装的包有 libevent-devel gmp-devel libc-client-devel libmcrypt-devel libiconv(需自己编译安装) ...

编译 PHP 的疑难解答

1. 遭遇 error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory

解决办法:

  1. /etc/ld.so.conf 中加一行 /usr/local/lib
  2. 运行 /sbin/ldconfig

2. 遇到 mcrypt 的错误:

/usr/bin/ld: cannot find -lltdl
collect2: ld returned 1 exit status
make: *** [ext/mcrypt/mcrypt.la] 错误 1

解决办法:

wget "http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&big_mirror=0"
tar zxvf libmcrypt-2.5.8.tar.gz 
cd libmcrypt-2.5.8/
./configure
make
make install
/sbin/ldconfig
cd libltdl/
./configure --enable-ltdl-install
make
make install
cd ../../

安装 eaccelerator 等 php 加速模块

wget http://pecl.php.net/get/memcache-2.2.6.tgz
wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2

然后分别解压,在各自目录里执行:

phpize
./configure
make
make install

需要注意的是, eaccelerator 的编译选项需要为:

./configure --enable-eaccelerator=shared