前天有一位新客户购买我们的 VPS 后多次在上面源码编译和安装 Nginx+PHP+FastCGI+MySQL 不成功,遇到一些问题,总的来说分为两类,一个是包依赖问题,一个是 MySQL 目录的权限设置问题。昨天这位客户给我们发来一个论坛链接很细致的描述了他的安装过程和遇到的问题,可惜后面回帖的人都没说到重点,还有一位回帖人居然是我们的客户,呵呵,世界好小。VPSee 决定花点时间写个教程,可能对其他的 Linux/VPS 用户也有帮助。我们的 VPS 和那些使用 SolusVM 控制面板和模版的 VPS 服务商不同,我们自己制作 VPS 模版,采用最小化安装,不添加任何乱七八糟的东西,保持最简和干净,所以 VPS 上只装有必备的软件包和库,在编译 Nginx+PHP+FastCGI+MySQL 之前必须先安装一些编译时需要的软件包和库。
记得以前有位客户问过为什么我们的 VPS 上连基本的 gcc 工具都没有?为什么我们采用最小化安装?为什么我们没有提供那些都安装好的模版?有3个原因,1、不需要 gcc Linux 也可以运行,所以 gcc 不是必须的,这满足我们最小化的要求;2、安全,如果有人得到 Linux 普通用户帐号可以下载、通过 gcc 编译和运行一些后门代码以得到 root 权限或者干坏事,所以不是必要的话不推荐安装 gcc 等编译工具,同样的道理也适用我们对其他工具的要求;3、定制,每个人的要求是不同的,有的人喜欢 nginx,有的人喜欢 apache,所以我们采用最小化安装,把选择留给客户。我们认为最小化可以带来简单、安全和灵活。
下面的操作步骤在我们的 256MB Debian 5.0 VPS 上测试通过,Nginx/PHP/MySQL 都采用当前最新稳定源代码版本。
安装必备软件包
# aptitude install libtidy-dev curl libcurl4-openssl-dev libcurl3 \ libcurl3-gnutls zlib1g zlib1g-dev libxslt1-dev libzip-dev libzip1 \ libxml2 libsnmp-base libsnmp15 libxml2-dev libsnmp-dev libjpeg62 \ libjpeg62-dev libpng12-0 libpng12-dev zlib1g zlib1g-dev libfreetype6 \ libfreetype6-dev libbz2-dev libxpm-dev libmcrypt-dev libmcrypt4 \ sqlite3 bzip2 build-essential libreadline5-dev libedit-dev autoconf
编译和安装 MySQL
下载和编译 MySQL,但是先不要安装:
# wget http://mysql.mirror.rafal.ca/Downloads/MySQL-5.1/mysql-5.1.50.tar.gz # tar zxvf mysql-5.1.50.tar.gz # cd mysql-5.1.50 # ./configure \ --prefix="/usr/local/mysql-5.1.50" \ --enable-thread-safe-client \ --with-extra-charsets=all # make
需要改几个权限问题才能安装 MySQL,否则会出现 Access denied for user ‘root’@'localhost’ (using password: NO) 经典问题:
# groupadd mysql # useradd -g mysql mysql # cp support-files/my-small.cnf /etc/my.cnf # vi /etc/my.conf ... [mysqld] user = mysql ... # chown -R mysql:mysql /usr/local/mysql-5.1.50/ # chmod 777 /tmp
安装和启动 MySQl,修改 root 密码,登录 MySQL:
# cd mysql-5.1.50 # make install # /usr/local/mysql-5.1.50/bin/mysql_install_db --user=mysql # /usr/local/mysql-5.1.50/bin/mysqld_safe & # /usr/local/mysql-5.1.50/bin/mysqladmin -u root password 'new-password' # /usr/local/mysql-5.1.50/bin/mysql -u root -p
编译和安装 PHP
先下载 PHP 软件包,然后配置、编译,这里采用 php 5.2 分支的最新稳定代码:
# wget http://www.php.net/get/php-5.2.13.tar.bz2/from/us.php.net/mirror # tar jxvf php-5.2.13.tar.bz2 # cd php-5.2.13 # ./configure \ --prefix="/usr/local/php-5.2.13" \ --with-mysql="/usr/local/mysql-5.1.50" \ --with-gd \ --with-ttf \ --with-openssl \ --enable-mbstring \ --enable-fastcgi # make && make install
编译和安装 Nginx
下载、配置和编译安装 nginx,注意编译 nginx 需要额外安装几个软件包:
# wget http://nginx.org/download/nginx-0.7.67.tar.gz # tar zxvf nginx-0.7.67.tar.gz # aptitude install libgcrypt11-dev libpcre3 libpcre3-dev libssl-dev # cd nginx-0.7.67 # ./configure --prefix="/usr/local/nginx-0.7.67" --with-http_ssl_module # make && make install
编译和安装 FastCGI
Nginx 需要 FastCGI 的支持才能运行 PHP 脚本,从 lighttpd 下载、编译和安装 spawn-fcgi:
# wget http://www.lighttpd.net/download/spawn-fcgi-1.6.2.tar.bz2 # tar jxvf spawn-fcgi-1.6.2.tar.bz2 # cd spawn-fcgi-1.6.2 # ./configure --prefix="/usr/local/php-5.2.13" # make && make install
启动 FastCGI:
# /usr/local/php-5.2.13/bin/spawn-fcgi -a 127.0.0.1 -p 9000 \ -u www-data -g www-data -f /usr/local/php-5.2.13/bin/php-cgi \ -P /var/run/fastcgi-php.pid
编辑 Nginx 的配置文件,让 php 脚本被发送到 FastCGI 服务器由 FastCGI 处理,然后启动 nginx:
# vi /usr/local/nginx-0.7.67/conf/nginx.conf ... # fix nginx/php/fastcgi important security issue # http://cnedelcu.blogspot.com/2010/05/nginx-php-via-fastcgi-important.html location ~ \..*/.*\.php$ { return 403; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php$ { #root html; root /usr/local/nginx-0.7.67/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx-0.7.67/html$fastcgi_script_name; include fastcgi_params; } ... # /usr/local/nginx-0.7.67/sbin/nginx -c /usr/local/nginx-0.7.67/conf/nginx.conf
安装 Nginx+FastCGI+PHP 完后测试一下是否 PHP 页面能否被正确解析,在 html 下创建一个含有 phpinfo(); 函数的文件,最后打开浏览器检查下面的 index.php 能否被正确执行。:
# vi /usr/local/nginx-0.7.67/html/index.php phpinfo();
编译源代码需要消耗大量内存,我们只建议 256MB 或以上 VPS 用户使用源码方式安装。