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

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

nginx的編譯安裝

編譯環境

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

$ 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庫支持mysql

openssl: 爲nginx提供ssl功能linux

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

確保pcre已正確安裝c++

在上面的基礎環境安裝中,咱們已經yum安裝了pcre,可是部分服務器上並無pcre的安裝包,因此咱們能夠經過下載tar包自行編譯安裝pcre。sql

搜索pcre,進入其官網,找到最新的版本,複製tar.gz的下載鏈接,執行以下操做:數據庫

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

這樣就能夠保證安裝pcre了。apache

建立用來運行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的編譯安裝

依賴環境

慣例是先解決一些編譯的依賴包

$ yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel

編譯安裝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.default 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做爲外網訪問地址訪問成功,那麼恭喜你,本篇文章的目的就達到了。

相關文章
相關標籤/搜索