編譯安裝nginx1.9.7+php7.0.0服務器環境

時間 2015-12-09 23:09:46  SegmentFault

原文  http://segmentfault.com/a/1190000004123048

主題 Nginx PHP


一直以來我都通過網上的一些材料去搭建lnmp環境,通過直接yum安裝nginx mysql php等軟件。但是爲了原生態的編譯安裝最新的軟件版本,我決定自己親手搭建lnmp環境,採用最新的nginx1.9.7(昨天出了1.9.8)和php7來研究如何搭建起nginx最新版本和php7的環境。

nginx的編譯安裝

編譯環境

在linux使用make方式安裝,需要保證linux已經具備比較OK的編譯環境,例如gcc等編譯工具。一般而言,服務器提供商在安裝的系統中已經默認集成了這些軟件,但是爲了保險起見,我們還是通過一些較爲基礎的方式,把這些依賴包都跑一遍,以防在之後的編譯中出差錯。

$ yum -y install gcc gcc-c++ autoconf automake libtool make cmake$ yum -y install zlib zlib-devel openssl openssl-devel pcre-devel

zlib: 爲nginx提供gzip模塊,需要zlib庫支持

openssl: 爲nginx提供ssl功能

pcre: 爲支持地址重寫rewrite功能

確保pcre已正確安裝

在上面的基礎環境安裝中,我們已經yum安裝了pcre,但是部分服務器上並沒有pcre的安裝包,所以我們可以通過下載tar包自行編譯安裝pcre。

搜索pcre,進入其官網,找到最新的版本,複製tar.gz的下載連接,執行如下操作:

$ wget http://pcre/xxx/xxx/xxx最新版xxx.tar.gz$ tar zxvf xxxx.tar.gz
$ cd xxxx
$ ./configure
$ make install

這樣就可以保證安裝pcre了。

創建用來運行nginx的用戶及組

我們創建一個新的用戶和用戶組來運行nginx,這樣可以把nginx和root分開,保證nginx不具備root權限。但是,我們並不希望nginx成爲一個真實的可以登陸到遠程進行操作的用戶,所以,我們並不給它創建家目錄,在useradd的時候,用-M參數:

$ groupadd nginx$ useradd -g nginx -M nginx

-g參數爲nginx用戶指定了一個組。-M參數保證其不自動生成home目錄。

但通過上面的用戶創建之後,nginx用戶可以通過設置一個密碼登陸到服務器,這個不是我們想要的,我們禁用它的ssh登陸權限.禁止用戶登陸也很方便,只需要修改配置文件中有關用戶和用戶組的信息即可。

$ vi /etc/passwd

找到nginx,將後面的 /bin/bash 改爲 /sbin/nologin 即可。

OK,用戶處理完畢。

編譯安裝Nginx

前面講了這麼多,都還沒有說到重點,接下來我們來編譯安裝nginx。先進入nginx的官方網站,找到最新版本的tar.gz包的鏈接,複製鏈接,然後執行下面的動作:

$ wget http://xxxxxxxxxx/nginx1.7.x.tar.gz$ tar zxvf nginx1.7.x.tar.gz$ cd nginx1.7.x

接下來我們需要執行./configure,不同的開發者有不同的習慣,對於剛入門的用戶而言,不是很喜歡麻煩的去進行配置,總是希望默認就是最好的,但是實際情況恰好相反,走上linux的道,就請熱愛折騰,既然選擇編譯安裝,就請熱愛make。

我希望把軟件安裝在/user/local下面,一個軟件一個目錄,在以後卸載的時候也比較方便清理。軟件的目錄也按照linux的目錄形式,用conf、etc、sbin、run等進行歸類管理,所以,我最終的./configure配置如下:

$ ./configure --prefix=/usr/local/nginx \--pid-path=/usr/local/nginx/run/nginx.pid \--with-http_ssl_module \--user=nginx \
 --group=nginx \--with-pcre \--without-mail_pop3_module \--without-mail_imap_module \--without-mail_smtp_module

末尾三個是禁用nginx作爲郵件代理服務器,我一般只用服務器作爲網站或數據庫的服務器,所以這裏把它們禁用掉,你如果想搭建的是郵件服務器,那麼就應該去閱讀nginx搭建郵件服務器的教程。

你可以認真閱讀一下./configure的結果,看看有沒有報錯,或者加載的模塊是不是都齊全,如果一切OK,那麼往下繼續,如果感覺不對,可以用./configure --help認真閱讀一下。

$ make$ make install

make的地方有一個小技巧,如果服務器是雙核,可以通過-j2來指定用雙核進行編譯,-j4代表4覈編譯。

安裝到這裏就結束了,但是,安裝完可沒完事兒,nginx還沒有運行起來,你可以先去看看安裝的結果,並且運行nginx服務器:

$ cd /usr/local/nginx$ ls$ sbin/nginx

這樣就運行起來了,訪問你的服務器ip,看看能否看到ngin的歡迎頁面吧。(不要讓其他軟件佔用80端口哦)默認情況下網頁文件放在/usr/local/nginx/html下,不符合我們的使用習慣,這個需要修改nginx的配置文件來修改,不過即使不修改,我們也是可以正常使用的,我們就不詳細解釋nginx的配置了。

nginx服務的載入

但是,make編譯安裝的軟件,可不像yum安裝的服務,我們熟悉的service命令並不起效,不然你用service nginx restart試試看。這是因爲service調用/etc/ini.d/目錄下的程序完成,而該目錄下並不存在nginx這個程序。那麼這個時候怎麼重啓nginx呢?如下操作:

$ /usr/local/nginx/sbin/nginx -s reload

這個操作可以重新加載nginx的配置文件,相當於重啓(當配置文件出錯時,不會重啓)。如果一定要重啓整個服務,那隻能通過殺死nginx進程,然後在運行程序了。

不過爲了使用我們熟悉的service操作,這裏提供一個 程序 ,放到/etc/ini.d/目錄下,並執行:

$ chmod +x /etc/init.d/nginx 
$ chkconfig --add nginx$ chkconfig nginx on

這樣就可以通過service nginx restart等方法來操作nginx了。你可以把程序下載下來,簡單研究一下,如果你的nginx安裝路徑和我的不同,還要修改程序開頭的變量設置。

PHP7的編譯安裝

編譯安裝php7

在《 lamp升級php至php7 》一文中,我談到了如何在apache的服務器環境中升級php到7,而到nginx環境下,我們不再使用php的apxs模塊,而是直接使用php-fpm模塊。接下來,我們來嘗試編譯安裝php7。

先從官方網站下載php7,並且解壓,由於上面這篇文章已經有了相關步驟,就不做過多詳解:

$ wget http://am1.php.net/get/php-7.0.0.tar.gz/from/this/mirror$ tar zvxf php-7.0.0.tar.gz$ cd php-7.0.0

接下來要進行編譯前的配置,和上面一篇文章不同,我們不提供apxs參數,相反,我們提供php-fpm相關參數:

$ ./configure --prefix=/usr/local/php7 \--with-config-file-path=/usr/local/php7/etc \--with-config-file-scan-dir=/usr/local/php7/etc/php.d \--with-mcrypt=/usr/include \--enable-mysqlnd \--with-mysqli \--with-pdo-mysql \--enable-fpm \--with-fpm-user=nginx \--with-fpm-group=nginx \--with-gd \--with-iconv \--with-zlib \--enable-xml \--enable-shmop \--enable-sysvsem \--enable-inline-optimization \--enable-mbregex \--enable-mbstring \--enable-ftp \--enable-gd-native-ttf \--with-openssl \--enable-pcntl \--enable-sockets \--with-xmlrpc \--enable-zip \--enable-soap \--without-pear \--with-gettext \--enable-session \--with-curl \--with-jpeg-dir \--with-freetype-dir \--enable-opcache

配置無誤後執行:

$ make$ make install

同樣可以使用-j2哦。如果安裝成功,OK,那麼php7的安裝就OK了。

調整php配置

默認安裝好之後,你會發現/usr/local/php7/etc下面沒有php.ini文件,這個去哪裏要呢?在php7的源碼安裝包都有。

$ cd /usr/src/php-7.0.0/$ ls

可以看到有兩個php.ini-xxx文件,我們可以分別vi打開來看下,一個是產品模式,一個是開發模式。

$ cp php.ini-production /usr/local/php7/etc/php.ini$ vi /usr/local/php7/etc/php.ini

可以看到php的配置。本文就不做過多的配置解釋了。

啓用php-fpm服務

上面我們在編譯php7的時候,已經將fpm模塊編譯了,那麼接下來,我們要啓用php-fpm。但是默認情況下它的配置文件和服務都沒有啓用,所以要我們自己來搞定。

搞定配置文件:

$ cd /usr/local/php7/etc$ mv php-fpm.conf.default php-fpm.conf$ mv php-fpm.d/www.conf.defualt php-fpm.d/www.conf

php-fpm的具體配置我們也不做深入去詳解,因爲在編譯之前./configure的時候,我們都已經確定了一些配置,比如運行fpm的用戶和用戶組之類的,所以默認配置應該不會存在路徑問題和權限問題。

搞定php-fpm的服務載入:

就像上面的nginx一樣,我們希望使用service php-fpm start|stop|restart這些操作來實現服務的重啓,但沒有像nginx那麼複雜,php編譯好之後,給我們提供了一個php-fpm的程序,不需要我再編寫分享了。這個文件放在php編譯源碼目錄中:

$ cd /usr/src/php-7.0.0/sapi/fpm$ ls$ cp init.d.php-fpm /etc/init.d/php-fpm$ chmod +x /etc/init.d/php-fpm$ chkconfig --add php-fpm$ chkconfig php-fpm on

通過上面這個操作,我們就可以使用 sevice php-fpm start 來啓用php-fpm了。用 ps -ef | grep php-fpm 看看進程吧。

nginx代理php實現訪問

通過上面的操作,nginx和php-fpm服務都被我們跑起來了,但是php-fpm走的是127.0.0.1:9000,外網是無法訪問的,而且我們也不可能直接通過php-fpm給外網提供服務,我們用nginx去代理9000端口執行php。

實際上這個過程只需要對nginx進行配置即可,fpm已經在後臺運行了,我們需要在nginx的配置文件中增加代理的規則,即可讓用戶在訪問80端口,請求php的時候,交由後端的fpm去執行,並返回結果。

$ vi /usr/local/nginx/conf/nginx.conf

如果你大致瞭解過nginx的配置,應該能夠很快分辨出這個配置文件裏面的結構,並且知道server代表一個虛擬主機,要增加虛擬主機就再增加一個server,而且這個conf文件中也給出了例子。那麼怎麼代理php-fpm呢?找到:

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

把前面的#註釋符號去掉,把script改爲$document_root最終如下:

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

這樣就OK了,重新載入nginx配置即可

$ service nginx reload

然後到/usr/local/nginx/html去寫一個php文檔,進行測試吧。

如果你的程序能夠正常運行起來,用ip作爲外網訪問地址訪問成功,那麼恭喜你,本篇文章的目的就達到了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章