天天看點

在 Debian 上源碼編譯和安裝 Nginx+PHP+FastCGI+MySQL

前天有一位新客戶購買我們的 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 使用者使用源碼方式安裝。