手把手教你在centos下編譯安裝配置高性能web服務器環境nginx+php(fast-cg...

本文爲實戰操做過程的全程記錄,採用一臺新建立的linode vps(512M內存)環境,操做系統採用centos 6.2,以從源碼編譯的方式安裝配置nginx, php(fast-cgi模式)web環境。php

咱們的目標:配置一臺高性能、安全的web服務器。所需軟件以下:html

Nginx(英文) Nginx(簡體中文) 公認的高性能web服務器[下載 http://nginx.org/en/download.html]node

PHP 應用最普遍的web開發語言[下載 http://www.php.net/downloads.php]mysql

MySQL 普遍應用於web服務器上的數據庫,速度快[下載 http://www.mysql.com/downloads/mysql/]linux

phpMyAdmin 使用php開發的基於web的MySQL管理工具 [下載 http://www.phpmyadmin.net/home_page/downloads.php]nginx

準備工做:

個人這臺vps主機名爲fsvps,有一個普通用戶名爲feng,一般我就使用這個用戶登陸管理,只有須要使用root身份時才su切換到管理員,只要再也不須要使用root權限就退回到普通用戶下。建議你也這樣操做,以避免誤操做形成不可挽回的災難。c++

經過ssh(windows下可使用putty,建議去官方下載英文原版)登陸服務器,確保已經安裝過過以下的必要的軟件(linux下軟件編譯環境)web

centos 6.x下的 MySQL安裝

咱們先作最簡單的,安裝mysql. 由於咱們不打算本身編譯它,使用centos的yum安裝就能夠了。固然,若是你願意,徹底是能夠的,參看這裏{從源碼編譯並安裝mysql數據庫[本文待寫]}sql

centos下,只須要一條命令就能夠安裝mysql服務器,執行su,按提示輸入root密碼,切換到root身份,而後運行yum install mysql-server數據庫

[feng@fsvps ~]$ su
[root@fsvps feng]# yum install mysql-server mysql-devel -y

yum安裝了好幾個包,其中

mysql-server-5.1.61-1.el6_2.1.i686.rpm 纔是咱們平時說的mysql;

mysql-5.1.61-1.el6_2.1.i686.rpm是命令行界面的mysql客戶端,咱們能夠用它在服務器上建立數據庫,管理mysql用戶等,但咱們一般使用更好用的phpMyAdmin;

mysql-devel-5.1.61-1.el6_2.1.i686.rpm則是mysql客戶端源碼的開發頭文件,接下來編譯php時要用的,因此安裝mysql這一步要先作。

yum還安裝好幾個依賴包,如mysql-5.1.61-1.el6_2.1.i686.rpm, openssl-1.0.0-20.el6_2.5.i686.rpm, zlib-devel-1.2.3-27.el6.i686.rpm, openssl-devel-1.0.0-20.el6_2.5.i686.rpm等幾個在php編譯也會用到。

注:這裏的幾個包,你在操做時,其版本號可能不徹底一致,這是由於yum源裏的包會不按期升級,但不影響咱們接下來的編譯過程。

咱們啓動mysql服務,mysqld將完成初始化操做。運行 /etc/init.d/mysqld start 以下

[root@fsvps feng]# /etc/init.d/mysqld start
...../usr/bin/mysqladmin -u root password 'new-password' /usr/bin/mysqladmin -u root -h fsvps password 'new-password'
.....
                                                         [肯定]
正在啓動 mysqld:                                          [肯定]

注意消息裏有如上斜體顯示的部分。這時候,你的mysql的root用戶仍是空密碼的,這很是不安全的,斜體行就是修改root密碼的命令。假設我要把mysql 的 root密碼修改爲 Path8.net ,執行命令以下:

[root@fsvps feng]# /usr/bin/mysqladmin -u root password 'Path8.net'

[tips] 注意,mysql的root用戶與linux系統的root用戶是沒有任何關係的,mysql 的root用戶只用於登陸mysql服務器。最好給他們設置成不一樣的密碼,這樣會安全一點。

試着登陸一下,確認root密碼已修改爲功:

[root@fsvps feng]# mysql -uroot -pPath8.net
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.61 Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

你沒看錯,mysql -uroot -pPath8.net 這行命令裏, -u 與 -p 後面沒必要要加空格

若是你看到上面最後一行的 mysql> 提示符,說明已經成功登陸。輸入執行 show variables; 感覺一下mysql

mysql> show variables;
+-----------------------------------------+------------------+
| Variable_name                           | Value            |
+-----------------------------------------+------------------+
| auto_increment_increment                | 1                |
| auto_increment_offset                   | 1                |
| autocommit                              | ON               |
.......(下略)

列出了不少變量,咱們優化MySQL,主要是就是靠修改這些參數實現的。

輸入exit ,退出mysql客戶端。mysql安裝配置至此結束,這一步簡單吧!

Nginx安裝

接下來編譯Nginx,稍微複雜一點,照着作,確定能夠很順利完成。

[強烈建議]若是你還在使用root用戶,建議你執行exit退出root身份,使用普通用戶的身份繼續操做。

進入該普通用戶的家目錄,建兩個目錄  source 與 build ,分別用於存儲下載的源代碼及做爲編譯的工做目錄。固然放到其它目錄下也能夠,名字也能夠任意取,只要方便使用管理。

[root@fsvps feng]# mkdir source build

你沒看錯,一條命令就建了這兩個目錄。進入build目錄

[root@fsvps feng]# cd build/

安裝nginx的依賴包:pcre

由於nginx須要安裝一個叫PCRE的軟件,在centos上可能找不到。筆者的經驗是,就算你經過yum 安裝了這個包,nginx也不認。那咱們就本身編譯安裝它。這個包的編譯安裝很簡單,正好咱們拿它練練手,熟悉熟悉linux編譯安裝軟件的通常過程。

[tips] linux下從源碼編譯安裝軟件通常是三步:配置、編譯、安裝。具體一點說就依次是執行三條命令:configure, make, make install. 很少講理論,實際操做一下就明白了。

 在build目錄下建立子目錄pcre

[feng@fsvps build]$ mkdir pcre
[feng@fsvps build]$ cd pcre

使用wget 工具從pcre官方下載 pcre 包,下載連接爲 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.zip,將它解壓縮到pcre目錄下

[feng@fsvps build]$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.zip

幾秒鐘就能夠下載完成。(若是提示 bash: wget: command not found 那是你尚未安裝wget,切換到root用戶,yum install wget -y 安裝之)

[feng@fsvps pcre]$ ls
pcre-8.21.zip

看一下,剛下載的 pcre源碼包,這是個zip包,使用unzip命令解壓縮之

[feng@fsvps pcre]$ unzip pcre-8.21.zip
[feng@fsvps pcre]$ ll
總用量 1680
drwxr-xr-x 6 feng feng    4096 12月 12 2011 pcre-8.21
-rw-rw-r-- 1 feng feng 1709377  6月 30 13:50 pcre-8.21.zip
[feng@fsvps pcre]$ cd pcre-8.21

進去看看裏面都是些什麼文件,特別注意一下configure文件

[feng@fsvps pcre-8.21]$ ll
總用量 3716
-rwxr-xr-x 1 feng feng   6961 10月  5 2009 132html
-rw-r--r-- 1 feng feng 338277 12月 11 2011 aclocal.m4
........  (略)
-rwxr-xr-x 1 feng feng 595700 12月 11 2011 configure
........  (略)
-rw-r--r-- 1 feng feng   3460  8月  2 2011 ucp.h

這個configure文件,就是「源碼安裝三步曲」的第一步的configure,它將檢查你的系統是否具有了編譯pcre必要的軟件包,配置出用於編譯pcre的環境,供第二步用。若是缺乏某些軟件,它會給出提示。

[tips] 另外,注意這個目錄裏還有幾個文件README, INSALL,LICENCE,它們都是普通的文本文件,供使用人閱讀,分別是 自述文件,安裝說明,受權協議。一般linux/unix世界的源碼包裏都有這幾個文件(有時做者會把INSTALL併成到README裏),建議閱讀一 下,尤爲是README與INSTALL。

執行第一步 configure

[feng@fsvps pcre-8.21]$ ./configure

注意configure命令前面要帶上 ./ ,由於咱們要執行的是在當前目錄下的configure文件,。

configure過程當中可能出現的幾個報錯,及緣由:

  • 1) ./configure: error: C compiler gcc is not found 緣由:你沒有安裝gcc ,這樣可能你也沒安裝下面幾個包,請一併安裝
    yum install gcc gcc-c++ autoconf make
  • 2) Makefile: 權限不夠 緣由:當前用戶沒有權限讀寫nginx源碼目錄,請切換到root下運行以下命令,做用是將當前目錄的全部文件全部者都設爲咱們正在使用的普通用戶。
    [root@fsvps nginx-1.2.1]# chown -R feng:feng  ./
    [root@fsvps nginx-1.2.1]# exit

    而後exit退出到普通用戶狀態下。 chown 後的 feng:feng 分別是所使用的普通帳號的用戶名,及其用戶組名。

開始編譯,這步很是簡單,運行make就能夠,可能要花費幾分鐘時間,你能夠乾點其它,好比起身活動一下。

[feng@fsvps pcre-8.21]$ make

完了若是看到下面的消息:make[1]: Leaving directory `/home/feng/build/pcre/pcre-8.21'
說明編譯完成了,那麼開始安裝。安裝很簡單,使用root用戶權限,運行make install 就能夠了。因此su,按提示輸入root密碼,切換到root身份

[feng@fsvps pcre-8.21]$ su
[feng@fsvps pcre-8.21]# make install

完了消息應該是 make[1]: Leaving directory `/home/feng/build/pcre/pcre-8.21'

這樣pcre就安裝好了。而後exit退回到普通用戶狀態下。

編譯安裝nginx

接下來纔是真正安裝nginx,過程差很少,但咱們要多配置幾個參數選項。

到 nginx官網上 http://nginx.org/en/download.html 找最新的穩定版的下載連接,寫本文時2012-06-30 最新版本爲 nginx-1.2.1  下載連接爲 http://nginx.org/download/nginx-1.2.1.tar.gz 使用wget 將其下載到vps上。

[root@fsvps build]$ wget http://nginx.org/download/nginx-1.2.1.tar.gz

幾秒鐘就能夠下載完成。(若是提示 bash: wget: command not found 那是你尚未安裝wget,切換到root用戶,yum install wget -y 安裝之)

解壓縮,而後把壓縮包移動到source目錄,以備不時之需。

[root@fsvps build]$ ll
總用量 708
-rw-r--r-- 1 root root 718161  6月  5 14:10 nginx-1.2.1.tar.gz
[root@fsvps build]$ tar xf nginx-1.2.1.tar.gz 
[root@fsvps build]$ ll
總用量 712
drwxr-xr-x 8 1001 1001   4096  6月  5 14:02 nginx-1.2.1
-rw-r--r-- 1 root root 718161  6月  5 14:10 nginx-1.2.1.tar.gz
[root@fsvps build]$ mv nginx-1.2.1.tar.gz ../source/

[tips] 文件名很長,打字太累? 試試tab鍵,好比先打出 mv ngi 而後按tab 鍵一次,沒反應,再按一次,看有什麼變化;而後繼續打一個句點,再按一次tab鍵。相信你已經能悟出點什麼了。

進入nginx源碼目錄,瀏覽一下里面的文件

[root@fsvps build]$ cd nginx-1.2.1/
[root@fsvps nginx-1.2.1]$ ll
總用量 560
drwxr-xr-x 6 1001 1001   4096  6月 30 11:39 auto
-rw-r--r-- 1 1001 1001 207988  6月  5 14:02 CHANGES
-rw-r--r-- 1 1001 1001 317085  6月  5 14:02 CHANGES.ru
drwxr-xr-x 2 1001 1001   4096  6月 30 11:39 conf
-rwxr-xr-x 1 1001 1001   2345  1月 18 15:07 configure
drwxr-xr-x 3 1001 1001   4096  6月 30 11:39 contrib
drwxr-xr-x 2 1001 1001   4096  6月 30 11:39 html
-rw-r--r-- 1 1001 1001   1365  1月 18 15:07 LICENSE
drwxr-xr-x 2 1001 1001   4096  6月 30 11:39 man
-rw-r--r-- 1 1001 1001     49 10月 31 2011 README
drwxr-xr-x 8 1001 1001   4096  6月 30 11:39 src

運行configure,就是本目錄下的該文件,上面標紅加;目錄是配置nginx的編譯環境,運行以下命令,參數比較長,能夠直接複製帖。

[root@fsvps nginx-1.2.1]$ ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/sbin/nginx --conf-path=/usr/local/conf/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --with-http_stub_status_module --with-http_gzip_static_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_random_index_module --with-cpu-opt=pentium4

注意configure命令要帶上./ ,上面已經標紅顯示。大體講一下是什麼意思 [注]若是你僅僅想編譯一個web環境用,而不想學習編譯linux程序的通常方法,這部分那能夠跳過不用看。

把參數重排下版,一行一個參數,簡單註釋一下

--prefix=/usr/local/nginx    #編譯後安裝到目錄 /usr/local/nginx 
--sbin-path=/usr/local/sbin/nginx #
--conf-path=/usr/local/conf/nginx/nginx.conf #主配置文件路徑
--error-log-path=/var/log/nginx/error.log  #錯誤日誌目錄
--pid-path=/var/run/nginx.pid    #nginx程序啓用後,自動將其進程號寫到該文件
--lock-path=/var/run/nginx.lock  #lock文件路徑
--with-http_stub_status_module   #經過web查看nginx運行狀態
--with-http_gzip_static_module   #gzip壓縮支持
--with-http_sub_module     #加入ngx_http_sub_module模塊
--with-http_flv_module     #加入flv模塊
--with-http_mp4_module     #mp4模塊
--with-http_random_index_module   #http_random_index_module模塊
--with-cpu-opt=pentium4    #針對intel cpu優化

--with-xxxx_module的那些模塊,若是你肯定不須要,那就能夠不要加入。那就這樣指定參數

./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/sbin/nginx --conf-path=/usr/local/conf/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock  --with-http_stub_status_module --with-http_gzip_static_module

只帶兩個比較有用的模塊。事實上這些參數一個都不指定,也是能夠,這樣就是按nginx的默認配置編譯了。若是你想查看ngix的configure都有哪些參數選項能夠運行 ./configure --help 查看,這裏很少講了。

若是報錯:./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

這是由於沒有找到PCRE包,請檢查是否正確安裝了PCRE包:

不出意外,應該能看到這樣報告消息:

Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + md5: using system crypto library
  + sha1: using system crypto library
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/sbin/nginx"
  nginx configuration prefix: "/usr/local/conf/nginx"
  nginx configuration file: "/usr/local/conf/nginx/nginx.conf"
  nginx pid file: "/var/run/nginx.pid"
  nginx error log file: "/var/log/nginx/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

有些軟件的configure完成後會給出相似的一個配置報告,供咱們檢查配置選項是否正確。若是有不正確處,或還想改改,那就再運行一次configure --xx --yyy.

確認無誤,開始編譯

[feng@fsvps nginx-1.2.1]$ make

開始編譯,很是快,可能一分鐘就編譯完成,最後消息大體如:make[1]: Leaving directory `/home/feng/build/nginx-1.2.1'

接下來,你應該知道了,切換到root身份,make install 安裝。

nginx運行測試

下面的操做要在root身份下操做。

我 們測試一下nginx是否正常工做。由於咱們把nginx的二進制執行文件配置安裝在 /usr/local/sbin/nginx  (前面的configure參數 --sbin-path=/usr/local/sbin/nginx ),目錄/usr/local/sbin/默認在linux的PATH環境變量裏,因此咱們能夠省略路徑執行它:

[root@fsvps nginx-1.2.1]# nginx

它不會有任何信息顯示。打開瀏覽器,經過IP地址訪問你的nginx站點,若是看到這樣一行大黑字,就證實nginx已經工做了:

Welcome to nginx!

看上去很簡陋,只是由於沒有給它作漂亮的頁面。咱們來簡單配置一下它的運行配置。咱們configure的參數--conf-path=/usr/local/conf/nginx/nginx.conf 這就是它的配置文件。咱們去看看。

[root@fsvps nginx-1.2.1]# cd /usr/local/conf/nginx/
[root@fsvps nginx]# ls
fastcgi.conf          fastcgi_params.default  mime.types          nginx.conf.default   uwsgi_params
fastcgi.conf.default  koi-utf                 mime.types.default  scgi_params          uwsgi_params.default
fastcgi_params        koi-win                 nginx.conf          scgi_params.default  win-utf

若是這裏沒有nginx.conf,但有個 nginx.conf.default,咱們用它複製個副本nginx.conf (早期版本默認是沒有nginx.conf的)

用你熟悉的編輯器打開它,推薦使用vim;若是不會用,那可使用nano, 功能簡單,但一看就會用: nano nginx.conf

找到以下的部分,大概在35行,

server {
        listen       80 default;
        server_name  localhost;
        root /var/www/html/default;         #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
        #    root   html;
            index  index.html index.htm;
        }
................
}

如上紅色加粗顯示部分,作三處修改:

  • listen 80 後插入「空格default」
  • 在裏面加入一行 root /var/www/html/default;
  • 註釋掉root html;一行

上面的server{....}是定義的一臺虛擬主機,咱們剛加入的一行是定義這個虛假主機的web目錄。listen 行的default是表示這一個server{...}節點是默認的虛假主機(默認站點)

執行 nginx -t 測試剛纔的nginx配置文件是否有語法錯誤:

[root@fsvps nginx]# nginx -t
nginx: the configuration file /usr/local/conf/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/conf/nginx/nginx.conf test is successful

顯示沒有錯誤,檢測經過。若是不是這樣,請返回仔細檢查你的配置文件是否哪裏寫錯了,注意行尾要有英文分號。

咱們在硬盤上建立這個目錄:

[root@fsvps nginx]# mkdir -p /var/www/html/default

寫一個html文件index.html/var/www/html/default目錄裏,使用你熟悉的編輯器,隨便寫什麼內容、怎麼排版。

而後讓nginx從新加載配置文件,看看剛纔創做的html頁面效果如何。

常見錯誤FAQ

1) 若是一般訪問時看到仍是 Welcome to nginx! ,請返回檢查,重點在這幾處:

  • 請確認/var/www/html/default 目錄下有你創做的index.html 文件?
  • 檢查該文件權限,other用戶是否有讀的權限? 若是不懂linux文件權限,請執行 chmod 755 /var/www/html/default/index.html
  • 檢查nginx.conf配置文件裏,只否只有一個server{...} 節點,而且該節點裏是否有 listen       80 default;   一行,注意其中要有 default
  • 檢查上述server{...}節點裏是否有 root /var/www/html/default; 一行,注意路徑是拼寫是否正確。
  • 檢查其中 location / {...} 節點裏的 #    root   html;  一行,是否註釋掉了。

2) 若是看到的是 404 Not Found 或者「找不到該頁面」相似的提示:

  • 檢查上述 location / {...} 節點中是否有這一行 index  index.html index.htm;

3) 若是訪問時,顯示「找不到服務器」、「沒法鏈接到服務器」這樣的錯誤:

  • 運行檢查nginx進程在運行,運行ps aux |grep nginx 命令,正常狀況有以下三條:
    nginx: master process nginx
    nginx: worker process
    grep nginx
    若是隻有第三條,請運行nginx 從新啓用nginx,若有報錯請照說明檢查。通常是配置文件的語法錯誤。
  • 請運行nginx -t 檢查配置文件是否有語法錯誤。

[tips] location / {...} 節點裏的 #    root   html;  一行,不註釋掉也能夠:請把你創造的index.html 放到/var/www/html/default/html目錄下。

至此,咱們的nginx也能夠正常工做了。是否在納悶「nginx怎麼這麼簡陋?只能顯示幾個乾巴巴的頁面」,這是由於咱們尚未給它裝備PHP這個核動力引擎。

建議你稍微休息一下,而後進入下一步的「php安裝」,要作好持久戰的準備,它比前面全部要花費時間都長。

php的安裝

php版本選擇

php官方提供了不少版本,咱們照例使用最新穩定版,http://www.php.net/downloads.php

本 文寫做時[2012-07-01],php最新版本有兩個分支,分別是是PHP 5.4.4 (Current stable) 與 PHP 5.3.14 (Old stable),聽說php 5.4分支的改動,會不支持比較舊的php程序,因此咱們選擇php 5.3分支(當前爲php-5.3.14)。雖然仍會有極少數很是古老的程序,必須在更舊版下才能運行,但咱們這裏不遷就它們了,由於咱們要使用 fast-cgi,而5.2版本自己不帶FPM (fast-cgi process manager),要打fpm補丁,會麻煩一些。若有興趣,可參閱張宴的 Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建賽過Apache十倍的Web服務器(第6版) http://blog.s135.com/nginx_php_v6/

下載php源碼到vps上

從 php官方下載頁面上http://www.php.net/downloads.php 點所選的版本,選擇距離最近的下載鏡像。若是是美國vps,就選個美國的鏡像,這樣更快。我選擇yahoo! inc.鏡像,應該全球訪問速度都比較快(php.net官方彷佛就是yahoo! inc.鏡像)。複製所選下載地址,經過wget下載到build/php目錄下,並解壓縮,而後把原始壓縮包移動到source目錄存檔。

[root@fsvps php]$ wget http://cn.php.net/get/php-5.3.14.tar.bz2/from/www.php.net/mirror
[root@fsvps php]$ ll
總用量 11160
-rw-r--r-- 1 root root 11408016  6月 14 16:10 php-5.3.14.tar.bz2
[root@fsvps php]$ tar xf php-5.3.14.tar.bz2 
[root@fsvps php]$ mv php-5.3.14.tar.bz2 ../../source
[root@fsvps php]$ cd php-5.3.14/

進入php源碼目錄,瀏覽一下,裏面文件至關多,注意裏面也有configure, README等文件,還有其它的幾個大寫文件名的文件,有興趣參閱一下。

[root@fsvps php-5.3.14]$ ll
總用量 4796
-rw-r--r--  1 101 101    3460  6月 13 08:20 acconfig.h
-rw-r--r--  1 101 101      28  6月 13 08:18 acconfig.h.in
-rw-r--r--  1 101 101   76103  6月 13 08:18 acinclude.m4
-rw-r--r--  1 101 101  306427  6月 13 08:20 aclocal.m4
drwxr-xr-x  2 101 101    4096  6月 13 08:18 build
-rwxr-xr-x  1 101 101     668  6月 13 08:18 buildconf
-rw-r--r--  1 101 101     334  6月 13 08:18 buildconf.bat
-rw-r--r--  1 101 101   11166  6月 13 08:18 CODING_STANDARDS
-rw-r--r--  1 101 101   44892  6月 13 08:18 config.guess
-rw-r--r--  1 101 101   33387  6月 13 08:18 config.sub
-rwxr-xr-x  1 101 101 3044114  6月 13 08:20 configure
-rw-r--r--  1 101 101   45450  6月 13 08:18 configure.in
-rw-r--r--  1 101 101      91  6月 13 08:18 CREDITS
drwxr-xr-x 79 101 101    4096  6月 13 08:18 ext
-rw-r--r--  1 101 101   24801  6月 13 08:18 EXTENSIONS
-rw-r--r--  1 101 101     137  6月 13 08:18 footer
-rw-r--r--  1 101 101    2233  6月 13 08:20 generated_lists
-rwxr-xr-x  1 101 101     486  6月 13 08:18 genfiles
-rw-r--r--  1 101 101    1143  6月 13 08:18 header
-rw-r--r--  1 101 101   93778  6月 13 08:18 INSTALL
-rw-r--r--  1 101 101       0  6月 13 08:20 install-sh
-rw-r--r--  1 101 101    3218  6月 13 08:18 LICENSE
-rw-r--r--  1 101 101  199728  6月 13 08:18 ltmain.sh
drwxr-xr-x  3 101 101    4096  6月 13 08:20 main
-rwxr-xr-x  1 101 101    3023  6月 13 08:18 makedist
-rw-r--r--  1 101 101    1073  6月 13 08:18 Makefile.frag
-rw-r--r--  1 101 101    2263  6月 13 08:18 Makefile.gcov
-rw-r--r--  1 101 101    5498  6月 13 08:18 Makefile.global
-rw-r--r--  1 101 101    5317  6月 13 08:18 makerpm
-rw-r--r--  1 101 101       0  6月 13 08:20 missing
-rw-r--r--  1 101 101       0  6月 13 08:20 mkinstalldirs
drwxr-xr-x  2 101 101    4096  6月 13 08:18 netware
-rw-r--r--  1 101 101  347865  6月 13 08:18 NEWS
drwxr-xr-x  2 101 101    4096  6月 13 08:20 pear
-rw-r--r--  1 101 101    1489  6月 13 08:18 php5.spec.in
-rw-r--r--  1 101 101    2523  6月 13 08:18 php.gif
-rw-r--r--  1 101 101   69609  6月 13 08:18 php.ini-development
-rw-r--r--  1 101 101   69631  6月 13 08:18 php.ini-production
-rw-r--r--  1 101 101    1570  6月 13 08:18 README.EXTENSIONS
-rw-r--r--  1 101 101    6249  6月 13 08:18 README.EXT_SKEL
-rw-r--r--  1 101 101    4618  6月 13 08:18 README.GIT-RULES
-rw-r--r--  1 101 101    5954  6月 13 08:18 README.input_filter
-rw-r--r--  1 101 101    3426  6月 13 08:18 README.MAILINGLIST_RULES
-rwxr-xr-x  1 101 101    6040  6月 13 08:18 README.namespaces
-rw-r--r--  1 101 101    6848  6月 13 08:18 README.PARAMETER_PARSING_API
-rw-r--r--  1 101 101    4740  6月 13 08:18 README.PHP4-TO-PHP5-THIN-CHANGES
-rw-r--r--  1 101 101   20918  6月 13 08:18 README.REDIST.BINS
-rw-r--r--  1 101 101   11244  6月 13 08:18 README.RELEASE_PROCESS
-rw-r--r--  1 101 101    4698  6月 13 08:18 README.SELF-CONTAINED-EXTENSIONS
-rw-r--r--  1 101 101   15373  6月 13 08:18 README.STREAMS
-rw-r--r--  1 101 101    7605  6月 13 08:18 README.SUBMITTING_PATCH
-rw-r--r--  1 101 101    6677  6月 13 08:18 README.TESTING
-rw-r--r--  1 101 101    4957  6月 13 08:18 README.TESTING2
-rw-r--r--  1 101 101    4261  6月 13 08:18 README.UNIX-BUILD-SYSTEM
-rw-r--r--  1 101 101     109  6月 13 08:18 README.WIN32-BUILD-SYSTEM
-rwxr-xr-x  1 101 101   78241  6月 13 08:18 run-tests.php
drwxr-xr-x 24 101 101    4096  6月 13 08:18 sapi
drwxr-xr-x  5 101 101    4096  6月 13 08:18 scripts
-rwxr-xr-x  1 101 101    2105  6月 13 08:18 server-tests-config.php
-rwxr-xr-x  1 101 101   51718  6月 13 08:18 server-tests.php
-rwxr-xr-x  1 101 101     108  6月 13 08:18 snapshot
-rw-r--r--  1 101 101      10  6月 13 08:18 stamp-h.in
-rw-r--r--  1 101 101       1  6月 13 08:18 stub.c
-rwxr-xr-x  1 101 101      50  6月 13 08:18 svnclean.bat
drwxr-xr-x 10 101 101    4096  6月 13 08:18 tests
-rw-r--r--  1 101 101    5109  6月 13 08:18 TODO
-rw-r--r--  1 101 101     163  6月 13 08:18 TODO-5.1
-rw-r--r--  1 101 101    3746  6月 13 08:18 TODO-PHP5
drwxr-xr-x  2 101 101    4096  6月 13 08:18 TSRM
-rwxr-xr-x  1 101 101   23267  6月 13 08:18 UPGRADING
-rw-r--r--  1 101 101     737  6月 13 08:18 UPGRADING.INTERNALS
-rwxr-xr-x  1 101 101     297  6月 13 08:18 vcsclean
drwxr-xr-x  3 101 101    4096  6月 13 08:18 win32
drwxr-xr-x  4 101 101    4096  6月 13 08:20 Zend

查看configure參數選項,

[root@fsvps php-5.3.14]$ ./configure --help

參數很是多,由於php功能實在太強大了。你熟悉php的話,就知道它有上百個模塊,咱們經常使用大概有幾十個。一般離不開的模塊,是默認被配置進去的,不須要咱們經過configure指定,咱們在configure步驟主要作兩件事:

  • 定義一些路徑,如php安裝路徑,配置文件路徑
  • 選擇所需的非默認模塊

若是沒有特殊需求,建議你按下面的選項來配置(爲方便閱讀,拆成多行了)

./configure
--prefix=/usr/local/php53
--with-config-file-path=/usr/local/etc
--with-config-file-scan-dir=/usr/local/etc/php.d
--mandir=/usr/local/man
--enable-fpm
--enable-calendar
--with-mcrypt
--enable-ftp
--with-zlib
--with-bz2
--with-curl
--with-gd
--enable-exif
--with-jpeg-dir
--with-png-dir
--with-freetype-dir
--enable-mbstring
--with-mysql
--with-mysqli
--with-pdo-mysql
--enable-zip
--enable-bcmath
--with-bz2

注意其中的 --enable-fpm 就是指定咱們要啓用php的fpm功能,必定要不能省的。

先不要急着運行./configure,如今運行幾乎必定要報錯:

configure: error: xxx not found. Please check your xxx installation.

緣由你應該想到了,咱們的centos中缺乏依賴包。

解決依賴包問題

咱們回過頭來解決依賴包問題。咱們的系統上缺乏哪些包呢?按我在上面的configure 選項,下面幾行命令中的包便是:

[root@fsvps feng]# yum -y install libxml2-devel
[root@fsvps feng]# yum -y install bzip2-devel
[root@fsvps feng]# yum -y install libcurl-devel
[root@fsvps feng]# yum -y install libjpeg-devel libpng-devel

這個依賴列表是怎麼知道的呢?運行configure,看提示什麼錯誤,就安裝相應包,記錄下來這些包名就知道了。或者檢查configure文檔或源碼,也是能夠的,不過這個工做量更龐大。

另外mcrype包centos源裏沒有的,要咱們手工編譯安裝,步驟以下:

cd build/
mkdir mcrypt
cd mcrypt
wget http://nchc.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.bz2
tar xf libmcrypt-2.5.8.tar.bz2 
cd libmcrypt-2.5.8
./configure
make
make install

其中 sourceforge.net 上的地址,若是不能下載,請點此從本站(path8.net)下載:libmcrypt-2.5.8.tar.bz2.zip [注]本文件是再次zip壓縮的,使用時需先unzip 再tar x]

或者你能夠到http://mcrypt.sourceforge.net/下載,但要注意,咱們須要的是 libmcrypt而不是mcrypt,這裏很容易搞錯。

開始configure php源碼

如今應該對configure很熟悉了吧,用普通用戶執行

[feng@fsvps php-5.3.14]$ ./configure --prefix=/usr/local/php53 --with-config-file-path=/usr/local/etc --with-config-file-scan-dir=/usr/local/etc/php.d --mandir=/usr/local/man --enable-fpm --enable-calendar --with-mcrypt --enable-ftp --with-zlib --with-bz2 --with-curl --with-gd --enable-exif --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-mbstring --with-mysql --with-mysqli --with-pdo-mysql --enable-zip --enable-bcmath --with-bz2

這一步要花幾分鐘時間,不出意外將出現以下消息:

+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE.  By continuing this installation |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

Thank you for using PHP.

按下來,make,這一步更慢,可能要二十分鐘,耐心等,或者作點其它事情。

看到以下消息,就是完成了。

Build complete.
Don't forget to run 'make test'.

能夠執行一下make test 檢測一下,不過通常沒有必要,切換到root身份運行make install安裝。

[feng@fsvps php-5.3.14]$ su
密碼:
[root@fsvps php-5.3.14]# make  install
Installing PHP SAPI module:       fpm
Installing PHP CLI binary:        /usr/local/php53/bin/
Installing PHP CLI man page:      /usr/local/man/man1/
Installing PHP FPM binary:        /usr/local/php53/sbin/
Installing PHP FPM config:        /usr/local/php53/etc/
Installing PHP FPM man page:      /usr/local/man/man8/
Installing PHP FPM status page:      /usr/local/php53/share/php/fpm/
Installing build environment:     /usr/local/php53/lib/php/build/
Installing header files:          /usr/local/php53/include/php/
Installing helper programs:       /usr/local/php53/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /usr/local/php53/lib/php/
[PEAR] Archive_Tar    - installed: 1.3.7
[PEAR] Console_Getopt - installed: 1.3.0
[PEAR] Structures_Graph- installed: 1.0.4
[PEAR] XML_Util       - installed: 1.2.1
[PEAR] PEAR           - installed: 1.9.4
Wrote PEAR system config file at: /usr/local/php53/etc/pear.conf
You may want to add: /usr/local/php53/lib/php to your php.ini include_path
/home/feng/build/php/php-5.3.14/build/shtool install -c ext/phar/phar.phar /usr/local/php53/bin
ln -s -f /usr/local/php53/bin/phar.phar /usr/local/php53/bin/phar
Installing PDO headers:          /usr/local/php53/include/php/ext/pdo/

最好記下來這裏的消息,它是php的幾個重要配置文件的默認路徑,下面用得着。

配置並啓動php-fpm進程

php-fpm的配置文件位於/usr/local/php53/etc/,這裏有個php-fpm.conf.default,用它複製出php-fpm.conf

[root@fsvps php-5.3.14]# ls -l /usr/local/php53/etc/
總用量 28
-rw-r--r-- 1 root root  1172  7月  1 07:20 pear.conf
-rw-r--r-- 1 root root 20891  7月  1 07:20 php-fpm.conf.default
[root@fsvps php-5.3.14]# cp /usr/local/php53/etc/php-fpm.conf{.default,}

修改php-fpm.conf以下幾處:

(約第25行)   pid = /var/run/php-fpm.pid
(約第32行)   error_log = /var/log/php-fpm.log
(約第190行) pm = static

啓動php-fpm進程

[root@fsvps php-5.3.14]# /usr/local/php53/sbin/php-fpm

執行後,沒有任何輸出。若是有錯誤請查看php-fpm的日誌文件 /var/log/php-fpm.log

 

執行 ps aux|grep php 將顯示有6個php-fpm進程,其中一個是root用戶,另外5個是nobody用戶。

整合php與nginx

直到如今,咱們的nginx仍是隻能處理靜態文件,咱們接下來要作的是:讓nginx把對.php文件的請求,轉給php-fpm來處理。

打開nginx配置文件,在server{...}節點裏面,有這樣一行 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 ,下面的 location ...{...}節點取消註釋,改爲以下形式(修改部分使用紅字加粗):

location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www/html/default$fastcgi_script_name;
    include        fastcgi_params;
}

保存,檢查配置nginx -t,無誤後從新加載nginx配置 nginx -s reload

寫一個php程序文件 /var/www/html/default/phpinfo.php 內容爲

<?php
phpinfo();
?>

用瀏覽器經過ip地址訪問phpinfo.php,看到你親自編譯的nginx+php-fpm在工做了吧。

繼續完善環境/優化配置

先別過高興,事實尚未完。

配置php主配置文件php.ini

有些讀者已經已經發現,phpinfo頁面裏顯示沒有加載php.ini文件,是的,咱們尚未把php.ini文件放到配置路徑裏。在php編譯目錄裏,有兩個,由於是生產環境,咱們使用./php.ini-production

[root@fsvps php-5.3.14]# cp php.ini-production /usr/local/etc/php.ini

若是須要的話,請對php.ini做相應修改配置。發進程信號給php-fpm從新加載配置

kill -SIGUSR2  `cat /var/run/php-fpm.pid`

或者ps aux  |grep php-fpm 查出來php-fpm主進程號,而後 kill -SIGUSR2 進程號

按服務器內存狀況配置php-fpm進程

php-fpm.conf

(約第200行)  pm.max_children = 5
(約第226行)  pm.max_requests = 100
(約第325行)  pm.status_path = /status.php

pm.max_children這是php-fpm啓動後的php-fpm子進程數,512M內存如下,推薦設置在5左右。設爲5,也說是說,最多接受5個併發的php請求。

pm.max_requests 是一個php-fpm子進程最多處理多少次請求後被關閉回收,小內存的主機,推薦設置小一點(100或者更小),避免處理一個佔用內存大的請求後、進程沒 被回收而長時間佔用內存。可是也不要設置得過小,不然頻繁的建立php-fpm子進程,從而影響效率。

pm.status_path 是用於查看當前php-fpm的狀態。修改保存後,從新加載php-fpm配置,使用瀏覽器打開 http://you-host-address/status.php ,能夠看到一組php-fpm的狀態數據,能夠用來檢查一般php-fpm併發進程數有多大,以及其它一些有用數據。

優化Nginx配置

nginx配置文件 /usr/local/conf/nginx/nginx.conf

worker_processes  1;     #nginx子進程數,512M內存如下推薦設置爲1就夠了,nginx併發能力很強
keepalive_timeout  25;   #鏈接保持的超時秒數
gzip  on;                #啓用靜態內容http請求的gzip壓縮

你的站點裏,若是有文件上傳目錄、圖片目錄等,那咱們就不要容許這裏的php文件請求傳遞給php-fpm,或直接拒絕訪問。能夠將下面一段代碼加入到 location ~ \.php$ {....} 節點前面,nginx發現這種請求,就直接deny,而再也不傳給php-fpm了

location ~ ^/(uploads|images)/.*\.php {
        deny  all;
}

若是你須要在nginx上綁定多個域名,就把server{...} 節點複製一份,修改裏面server_name(域名)參數、root參數(站點目錄)

server {
    server_name  www.path8.net;
    root /var/chroot/home/pcobbs/www;
    ......
}

把多個域名綁定到同一目錄上,就用空格分隔跟在後面,如

server_name  host1a.path8.net host2.path8.net;

本文的最新更新將發表於 http://blog.path8.net/archives/6068.html
相關文章
相關標籤/搜索