一直以來我都經過網上的一些材料去搭建lnmp環境,經過直接yum安裝nginx mysql php等軟件。可是爲了原生態的編譯安裝最新的軟件版本,我決定本身親手搭建lnmp環境,採用最新的nginx1.9.7(昨天出了1.9.8)和php7來研究如何搭建起nginx最新版本和php7的環境。php
在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和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的官方網站,找到最新版本的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的配置了。
可是,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安裝路徑和個人不一樣,還要修改程序開頭的變量設置。
慣例是先解決一些編譯的依賴包
$ yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel
在《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了。
默認安裝好以後,你會發現/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的配置。本文就不作過多的配置解釋了。
上面咱們在編譯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-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做爲外網訪問地址訪問成功,那麼恭喜你,本篇文章的目的就達到了。