一.關於LNAMP環境的介紹:php
Lnamp環境是由linux + nginx+apache+mysql+php組成的,Nginx作網站前端,Apache後端處理PHP文件。做爲 Web 服務器:相比 Apache,Nginx 使用更少的資源,支持更多的併發鏈接,體現更高的效率,這點使 Nginx 尤爲受到虛擬主機提供商的歡迎。在高鏈接併發的狀況下,Nginx是Apache服務器不錯的替代品 結合了Nginx高併發和靜態頁面高效率以及Apache穩定的動態頁面處理特色。這樣一來不再用擔憂Nginx以FastCGI模式運行PHP時的502問題,也沒必要擔憂Apache處理靜態頁面過慢,負載太高的問題。html
wdOS是一個基於CentOS版本精簡優化過的Linux服務器系統,並集成nginx,apache,php,mysql等web應用環境及wdcp管理系統,能夠說安裝和使用都很是便利。我此次是選在wdOS的純系統下安裝lnamp環境,但這只是初步的安裝,並無進行mysql以及php的優化。前端
LNAMP的安裝中php的編譯安裝比較麻煩,須要分爲兩次編譯,另外nginx以及apache的配置也比較複雜,apache須要開啓虛擬主機的功能,使得apache監聽非80端口,nginx反向代理php請求與apache協同工做。mysql
二.安裝過程:linux
第一步:安裝前準備工做nginx
建立存放源代碼的目錄: mkdir /usr/local/src c++
建立apache的安裝目錄: mkdir /usr/local/apacheweb
建立php的安裝目錄: mkdir /usr/local/phpsql
建立mysql的安裝目錄: mkdir /usr/local/mysqlshell
建立nginx的安裝目錄: mkdir /usr/local/nginx
第二步:下載安裝編譯須要用到的庫文件:
1. nginx編譯時須要用到的編譯庫文件
openssl-devel,glib2-devel ,pcre-devel ,bzip2-devel 以及gzip-devel
不過,wdOS系統下默認安裝了openssl-devel這個庫文件
因此剩下的使用命令 yum install glib2-devel pcre-devel bzip2-devel gzip-devel 下載安裝便可
2. 檢查系統是否安裝了編譯mysql所須要的工具包gcc 、gcc-c++ ,ncurses-devel和camke(mysql5.5版本後不使用configure安裝,而是使用cmake來安裝)
咱們使用rpm -qa | grep gcc 和rpm -qa | grep ncurses-devel進行檢查:
也就是說,wdOS系統中尚未安裝 ncurses-devel ,因此咱們可使用yum命令進行安裝
下載cmake源代碼到/usr/local/src下:
wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz
解壓縮:tar zxvf cmake-2.8.4.tar.gz
進入/usr/local/src/cmake-2.8.4這個目錄下設置,
./bootstrap
gamke:
gmake install
3.下載安裝php時須要用到的編譯庫文件:
yum -y install libevent libevent-devel libxml2 libxml2-devel libmcrypt libmcrypt-devel libmcrypt libmcrypt-devel curl-devel libpng-devel libtool-ltdl-devel
第三步:源碼編譯安裝mysql5.5.25a
爲mysql數據庫添加用戶和用戶組:(我這裏假設爲mysql用戶以及mysql用戶組)
groupadd mysql
useradd -g mysql mysql
下載mysql源代碼:
wget -c http://cdn.mysql.com/Downloads/MySQL-5.5/mysql-5.5.25a.tar.gz
tar xvf mysql-5.5.25a.tar.gz 進行解壓縮:
設置編譯時的環境參數:
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -----指定mysql的安裝目錄
編譯 make:
安裝: make install
在當前目錄下,創建配置文件:
cp support-files/my-medium.cnf /etc/my.cnf
說明:在展開的源碼包目錄中的「support-files」文件夾下,提供了多個MySQL服務器的配置文件,分別適用於不一樣負載的數據庫服務器,通常選擇my-medium.cnf文件便可,該配置文件適用於中等負載的數據庫,能夠知足大多數企業的應有需求。
設置軟鏈接使mysql和mysqladmin的bin命令能在shell中直接運行:
建立用於存放mysql數據和日誌的目錄,並修改目錄全部者和屬組爲mysql:
如今到/etc/my.cnf配置文件下,作下面的修改:
進入mysql安裝目錄下的腳本目錄下的腳本目錄:/tmp/mysql-5.5.25a/scripts
先修改mysql_install_db這個文件的權限:
chmod 750 mysql_install_db
而後,利用mysql_install_db腳本生成新的mysql受權表:
./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/var/mysql/data &
添加啓動腳本:
cp /usr/local/src/mysql-5.5.25a/support-files/mysql.server /etc/rc.d/init.d/mysqld
修改啓動腳本:添加basedir以及datadir的路徑:
修改啓動腳本的權限:
chmod 750 /etc/rc.d/init.d/mysqld
啓動數據庫:
檢查數據庫的默認偵聽端口 3306是否開啓:
第四步:源碼安裝apache-2.2.22
先下載apache源代碼到目錄/usr/local/src下:(我這裏下載的apache版本爲2.2.22)
wget -c http://apache.etoak.com/httpd/httpd-2.2.22.tar.gz
下載完成以後開始解壓縮:(這裏給出部分截圖)
tar -zxvf httpd-2.2.22.tar.gz
進入解壓縮後的httpd-2.2.22這個目錄下,設定編譯時的參數:
./configure --prefix=/usr/local/apache ----將apache安裝在這個目錄下
--enable-vhost-alias ----支持虛擬主機的功能
--enable-rewrite -----容許重寫
--enable-info
開始進行編譯:make
編譯完進行安裝 :make install
在當前目錄下,複製apache的初始化文件到/etc/init.d目錄下,並命名爲httpd,修改其權限:
cp build/rpm/httpd.init /etc/init.d/httpd
設置Apache開機自啓動:(我這裏使用的是方法一)
方法一:輸入下列命令:
chconfig --add httpd
chkconfig -- level 345 httpd on
方法二:
編輯 vi /etc/init.d/httpd
找到 chkconfig:這句,添加3 4 5
找到description: 這句,添加Apache httpd
設置完以後你能夠輸入 chkconfig --list | grep httpd 檢查一下3,4,5是否爲on:
修改apache服務器的配置文件:
vi /usr/local/apache/conf/httpd.conf,找到ServerName那一行,去掉前面的註釋
爲了適應啓動腳本,咱們建立一些符號連接:
重啓一下apache服務器:
/etc/init.d/httpd start
第五步:源碼編譯安裝nginx-1.0.4
進入/usr/local/src 這個目錄下載nginx源碼:
wget -c http://nginx.org/download/nginx-1.0.4.tar.gz
解壓縮nginx 源代碼包:
tar -zxvf nginx-1.0.4.tar.gz
進入解壓好的nginx-1.0.4 這個目錄配置相應的編譯參數:
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/log/run/nginx.pid --lock-path=/var/log/lock/subsys/nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_perl_module --with-mail --without-http_rewrite_module --with-pcre
make 進行編譯:
編譯完就能夠進行安裝:make install
第六步:源碼編譯安裝php-5.3.10
說明:php的編譯這一步要分爲兩部分進行,要先編譯支持apache模塊的,而後再編譯支持nginx模塊的。若是同時進行編譯就會報錯:You've configured multiple SAPIs to be build(見下圖:)
因此,咱們就先編譯支持apache的
這一部分的php編譯設置的參數:
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-mbstring --enable-fpm --with-iconv-dir=/usr/local/libiconv --enable-xml --with-curl --with-curlwrappers --with-mhash --with-gd --enable-gd-native-ttf --with-xmlrpc --with-zlib --with-apxs2=/usr/local/apache/bin/apxs --with-config-file-path=/usr/local/php/etc
make
make imstall
完成後,就能夠繼續設置支持nginx的編譯參數了:
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-mbstring --enable-fpm --with-iconv-dir=/usr/local/libiconv --enable-xml --with-curl --with-curlwrappers --with-mhash --with-gd --enable-gd-native-ttf --with-xmlrpc --with-zlib
而後重複與上面apache類似的步驟,make & make install
創建php配置文件:
複製php.ini到php安裝目錄 php.ini-development 到/usr/local/php/lib 這個目錄下並重命名爲php.ini:
說明:php.ini 是 PHP 在啓動時會讀取的配置文件,我這裏沒有作配置。另外,php5.0版本以後文件的名字發生了改變,其中php.ini-production對應於php.ini-recommended;而php.ini-development對應於php.ini-dist 。php.ini-dist 適合開發程式使用(也就是測試使用), php.ini-recommended 擁有較高的安全性設定,適合上線當產品使用
作方便php的運行的連接,不用配置環境變量
完成以後,咱們就能夠查看php的版本:
第七步:整合nginx和php:
修改進程管理器php-fpm的配置:
說明:在LAMP平臺下,php是被編譯成爲模塊而後被apache所調用;而在LNMP平臺下,php是被編譯成二進制文件執行,這樣就須要經過fastCGI技術來實現nginx和php的整合。這裏經過使用fastCGI的一個進程管理器php-fpm,php5.3.3之後的版本已經內置了php-fpm,使用的時候只須要加入參數--enable-fpm就能夠由此整合php與nginx
cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf
進入php-fpm的主配置文件 php-fpm.conf,找到圖中的部分作相應的修改:
最後就是在/usr/local/nginx/html 這個目錄下建立一個文件命名爲info.php,在裏面添加如下測試內容:
完成後可使用 /usr/sbin/nginx來重啓nginx服務,若是啓動的時候提示:nginx: [emerg] getpwnam("nginx") failed
這時,你只須要 vi /etc/nginx/nginx.conf 進入到這個文件,將配置文件的第一行中的user nobody 這一行的註釋去掉便可。
第八步:爲apache設置虛擬主機,使得apache偵聽非80端口
(我這裏以同一個ip對應兩個不一樣的端口爲例)
vi 編輯httpd的主配置文件/usr/local/apache/conf/httpd.conf,修改原來的80端口爲8080以及8081端口:
同時註釋下面這句:
爲使Apache支持rewrite(僞靜態),註釋原來的apache文件根目錄:
修改Directory模塊內容(至關是全局的,之後httpd-vhosts.conf也會用到這個設置) ,將AllowOverride none改成all ,註釋掉下面的order.....
開啓了httpd-vhosts虛擬主機文件:
修改完主配置文件,下面就是虛擬配置文件的修改:
vi /usr/local/apache/conf/extra/httpd-vhosts.conf
增長8080以及8081這兩個偵聽端口:
仿照下圖,作相應的修改:(因爲我這裏沒有配置dns服務器,因此servername 這句能夠用localhost代替)
說明:上圖中配置的ErrotLog以及CustomLog中的文件請確保存在,像我這裏8081端口中的ErrotLog以及CustomLog中的文件我尚未創建,因此這裏先進入到/usr/local/apache/logs目錄下而後建立文件:
另外,虛擬主機中用到的文件根目錄以及測試文件也應該相應的建立:(cd /usr/local/apache/htdocs)
mkdir 8080
mkdir 8081
同時將該目錄下的index.html 複製到8080以及8081這兩個目錄下:
cp index.html 8080
cp index.html 8081
而後建立一個文件命名爲test.php,在裏面添加如下測試內容,用以測試mysql是否能與php協同工做:
將這個文件複製到8080以及8081這兩個目錄下:
cp test.php 8080
cp test.php 8081
第九步 :Nginx採用反Nginx採用反向代理的方式接收Apache的處理結果
說明:Nginx採用反向代理的方式接收Apache的處理結果,須要先寫一些代理的參數,能夠將下面的配置保存爲proxy_params,之後每一個用到proxy_pass的地方都把proxy_params這些參數include進來。
在/etc/nginx/ 這個目錄下新建一個proxy_params文件(touch proxy_params),而後添加下面的代理參數:
附:代理參數的註解
proxy_redirect http:// $scheme:// #重定向
proxy_set_header Host $host; #轉發IP等HTTP頭信息
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #與後端發起握手等待響應超時時間
proxy_connect_timeout 30; #與後端鏈接成功後等待響應時間(已進入處理隊列等候處理)
proxy_read_timeout 60; #後端服務器回傳數據時間(後端必須在指定時間內將數據傳送完畢)
proxy_send_timeout 30; #保存用戶的頭信息大小
proxy_buffers 8 128k; #高負載時可請求更大proxy_buffers(通常設爲proxy_buffers的兩倍)
而後在/etc/nginx/nginx.conf這個文件中用到proxy_pass的地方都把proxy_params這些參數include進來:
下面是我從網上搜來的rewrite規則:(規則要放在配置文件的location /{ }外面,server{ }裏面 )
try_files $uri $uri/ @apache;
location @apache {
proxy_pass http://127.0.0.1:80; -----這裏的127.0.0.1改成本身的ip地址
include proxy_params;
}
說明:跟LNMP相比,rewrite規則顯得麻煩不少,由於Nginx的rewrite和Apache的rewrite是串行處理的,即Nginx 進行rewrite以後,若是處理後的請求被交給Apache,那麼Apache又會再根據本身的rewrite rule再處理;相反Apache的rewrite結果就不會再交回Nginx處理。因此,避免麻煩的方法是,只讓Nginx作rewrite,由於Nginx的rewrite效率比Apache的高。
另外,Nginx的Rewrite功能須要用到PCRE(正式表達式庫) 可使用
wget http://sourceforge.net/projects/pcre/files/pcre/8.01/pcre-8.01.tar.gz 下載pcre源碼包,而後編譯安裝(make, make install)
安裝完以後,在nginx的配置參數中加入 --with pcre ,而後從新編譯安裝便可。不然會報nginx: [emerg] the using of the regex "\.php$" requires PCRE library in /etc/nginx/nginx.conf:68 這樣的錯,以下圖:
第十步:爲apache安裝rpaf模塊
說明:rpaf這個模塊用於apache作後端時能夠獲取訪客真實的IP
先下載源碼到/usr/local/src這個目錄下:
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
解壓縮這個源碼包:
tar -zxf mod_rpaf-0.6.tar.gz
進入 mod_rpaf-0.6 這個目錄下:
/usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
這樣rpaf模塊就安裝完成了。
修改httpd主配置文件/usr/local/apache/conf/httpd.conf:
找到LoadModule添加加載rpaf模塊的語句:
LoadModule rpaf_module modules/mod_rpaf-2.0.so
同時在IfModule添加下面這段:
所有設置完成後重啓一下各項服務:
/usr/sbin/nginx 啓動(/usr/sbin/nginx -s reload重啓)nginx服務
service httpd restart 重啓httpd 服務
重啓完成後能夠輸入 netstat -lnpt 查看下端口是否開啓:
其中3306爲mysqld的偵聽端口,9000爲php-fpm進程管理器的偵聽端口,80爲nginx的偵聽端口,8080和8081均爲httpd的偵聽端口
三.測試結果:
虛擬主機的測試:(8081端口)
在8081端口中關於mysql與php協同工做的測試:
8080端口的測試:
在8080端口中關於mysql與php系統工做的測試:
Nginx偵聽的80端口的測試:
附:關於rewrite語法的一些介紹:
rewrite 的語法
語法: rewrite regex replacement flag
默認: none
做用域: server, location, if
這個指令根據表達式來更改URI,或者修改字符串。指令根據配置文件中的順序來執行。
注意重寫表達式只對相對路徑有效。若是你想配對主機名,你應該使用if語句。
rewrite只是會改寫路徑部分的東東,不會改動用戶的輸入參數,所以這裏的if規則裏面,你無需關心用戶在瀏覽器裏輸入的參數,rewrite後會自動添加的,所以,咱們只是加上了一個?號和後面咱們想要的一個小小的參數 ***https=1就能夠了。
nginx的rewrite規則參考:
1 ~ 爲區分大小寫匹配
2 ~* 爲不區分大小寫匹配
3 !~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹
4 -f和!-f用來判斷是否存在文件
5 -d和!-d用來判斷是否存在目錄
6 -e和!-e用來判斷是否存在文件或目錄
7 -x和!-x用來判斷文件是否可執行
8 last 至關於Apache裏的[L]標記,表示完成rewrite,呵呵這應該是最經常使用的
9 break 終止匹配, 再也不匹配後面的規則
10 redirect 返回302臨時重定向 地址欄會顯示跳轉後的地址
11 permanent 返回301永久重定向 地址欄會顯示跳轉後的地址