大型網站優化技術4


  1. nginx簡介
  2. 安裝nginx
  3. nginx配置文件詳解
  4. 重寫機制(瞭解)
  5. nginx虛擬主機
  6. 動靜分離
  7. 反向代理
  8. 負載均衡(瞭解)
  9. 安裝PHP
  10. PHP-FPM
科學上網工具

1. nginx簡介

1.1 nginx是什麼

Nginx是俄羅斯人編寫的十分輕量級的HTTP服務器,Nginx,它的發音爲“engine X”, 是一個高性能的HTTP和反向代理服務器,同時也是一個IMAP/POP3/SMTP 代理服務器。Nginx是由俄羅斯人 Igor Sysoev爲俄羅斯訪問量第二的 Rambler.ru站點開發的,它已經在該站點運行超過兩年半了。Igor Sysoev在建立的項目時,使用基於BSD許可。自Nginx 發佈來,Nginx 已經因爲它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。

1.2 Nginx的優點

  • 高併發
    • 官方測試能夠支撐5萬併發連接,在實際生產環境中跑到2~3萬併發連接數。
  • 內存消耗少
    • 在3萬併發連接下,開啓的10個Nginx 進程才消耗150M內存(15M*10=150M)。
  • 配置文件簡單
    • 風格跟程序一樣通俗易懂。
  • 成本低
    • Nginx爲開源軟件,可以免費使用。而購買F5 BIG-IP、NetScaler等硬件負載均衡交換機則需要十多萬至幾十萬人民幣。
  • 支持重寫機制
    • 能夠根據域名、URL的不同,將 HTTP 請求分到不同的後端服務器羣組。
  • 內置的健康檢查功能
    • 如果 Nginx Proxy 後端的某臺 Web 服務器宕機了,不會影響前端訪問。
  • 節省帶寬
    • 支持 GZIP 壓縮,可以添加瀏覽器本地緩存的 Header 頭。
  • 穩定性高
    • 用於反向代理,宕機的概率微乎其微。

      Nginx專爲性能優化而開發,性能是其最重要的考量,實現上非常注重效率 。它支持內 核Poll模型,能經受高負載的考驗,有報告表明能支持高達 50,000個併發連接數。 Nginx具有很高的穩定性,其它HTTP服務器當遇到訪問的峯值,或者有人惡意發起慢速連接時,也很可能會導致服務器物理內存耗盡頻繁交換,失去響應只能重啓服務器。例如當前Apache一旦上到200個以上進程,web響應速度就明顯非常緩慢了。而Nginx採取了分階段資源分配技術,使得它的CPU與內存佔用率非常低。Nginx官方表示保持 10,000個沒有活動的連接,它只佔2.5M內存,所以類似DOS這樣的攻擊對Nginx來說基本上是毫無用處的。就穩定性而言,nginx比lighttpd更勝一籌。 Nginx支持熱部署,它的啓動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運 行數個月也不需要重新啓動。你還能夠在不間斷服務的情況下,對軟件版本進行進行升級。 Nginx採用master-slave模型,能夠充分利用SMP的優勢,且能夠減少工作進程在磁 盤I/O的阻塞延遲。 Nginx代碼質量非常高,代碼很規範,手法成熟, 模塊擴展也很容易。 Nginx採用了一些os提供的最新特性如對sendfile (Linux2.2+),accept-filter(FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,從而大大提高了性能。

1.3 誰在用

2015年nginx的市場份額終於超越了IIS,排在了第二位

國內有企業有哪些在使用nginx服務器:
國內使用Nginx的網站:新浪、網易、騰訊、CSDN、酷六、水木社區、豆瓣、六房間、小米等。

Tengine

2. 安裝nginx

2.1 在windows上安裝

下載

下載nginx的windows版本
http://nginx.org/download/nginx-1.8.0.zip

解壓

將壓縮文件解壓到非中文的目錄下(綠色軟件只需要壓縮即可)

啓動

確保apache關閉

進入解壓的目錄下執行start nginx.exe 命令

啓動後在瀏覽器中訪問到nginx歡迎界面說明安裝啓動成功

停止

nginx -s stop 快速關閉
nginx -s quit 安全關閉
nginx -s reload 重載配置文件
nginx -s reopen 重新打開日誌文件

管理工具

類似於ApacheMonitor的管理工具

編寫nginx.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
@ECHOOFF
SETNGINX_PATH=F:
SETNGINX_DIR=F:\server\nginx-1.9.5\
color0a
TITLENginxManagement
GOTOMENU
:MENU
CLS
ECHO.
ECHO.****NginxManagement***********
ECHO.**
ECHO.*1Nginx*
ECHO.**
ECHO.*2Nginx*
ECHO.**
ECHO.*3Nginx*
ECHO.**
ECHO.*4*
ECHO.**
ECHO.*5退*
ECHO.**
ECHO.************************
ECHO.
ECHO.
set/pID=
IF"%id%"=="1"GOTOcmd1
IF"%id%"=="2"GOTOcmd2
IF"%id%"=="3"GOTOcmd3
IF"%id%"=="4"GOTOcmd4
IF"%id%"=="5"EXIT
PAUSE
:cmd1
ECHO.
ECHO.Nginx......
IFNOTEXIST%NGINX_DIR%nginx.exeECHO%NGINX_DIR%nginx.exe
%NGINX_PATH%
cd%NGINX_DIR%
IFEXIST%NGINX_DIR%start%NGINX_DIR%nginx.exe
ECHO.OK
PAUSE
GOTOMENU
:cmd2
ECHO.
ECHO.Nginx......
taskkill/F/IMnginx.exe>nul
ECHO.OK
PAUSE
GOTOMENU
:cmd3
ECHO.
ECHO.Nginx......
taskkill/F/IMnginx.exe>nul
ECHO.OK
GOTOcmd1
GOTOMENU
:cmd4
ECHO.
ECHO.Nginx......
nginx.exe-t
ECHO.OK
PAUSE
GOTOMENU

 

拷貝nginx.bat

拷貝nginx.bat文件到nginx文件夾下

修改路徑

修改nginx.bat中配置nginx的安裝路徑
就是修改SET NGINX_DIR的值

注意: 該目錄後必須以/結尾:

使用nginx.bat控制nginx

運行nginx.bat即可

2.2 在Linux上安裝

配置yum源

由於網絡問題,我們的試驗中可能會需要使用光盤作爲yum源

  1. 加載光盤鏡像
    • 在虛擬機軟件中選擇光盤鏡像
  2. 掛載光盤
    • 掛載光驅到/mnt/cdrom文件下
  3. 配置光盤源
    • 創建配置文件並且寫入以下配置

       

      vi /etc/yum.repos.d/cdrom.repo 

    • 配置:

      [cdrom]
      name=CentOS5 - cdrom
      baseurl=file:///mnt/cdrom/
      enable=1 
      gpgcheck=0
      gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
  4. 禁用其它源
    • 只保留cdrom源在/etc/yum.repos.d/中把其他的配置放到bak中.mkdir /etc/yum.repos.d/bak
      mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
      mv /etc/yum.repos.d/bak/cdrom.repo /etc/yum.repos.d/
  5. 查看當前使用的源
    • 查看被用到的yum源yum clean all
      yum repolist

使用yum安裝編譯環境

yum -y install automake autoconf libtool make
yum -y install gcc gcc-c++

 

安裝pcre

tar -zxvf pcre-8.32.tar.gz
cd pcre-8.32
./configure 
make && make install
有些資料說可以指定--prefix=/usr/local/pcre安裝目錄,其實指定了以後,會導致nginx設定該目錄仍舊報錯,建議不指定

 

安裝zlib庫

如果lamp搭建的時候已經安裝,無需再次安裝。
tar -zxvf zlib-1.2.5.tar.gz
cd zlib-1.2.5
./configure --prefix=/usr/local/zlib
make && make install

 

安裝nginx

tar -zxvf nginx-1.8.0.tar.gz
cd nginx-1.8.0
請注意,首先需要創建需要的目錄,本軟件不會自動創建
./configure --prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log
以下兩條需要特別注意:
1.pcre編譯安裝無法指定,需要yum方式安裝,否則需要制定pcre的解壓目錄
2.如果安裝zlib的時候沒有指定目錄,請不要寫--with-zlib這個選項,或者寫zlib的解壓目錄/安裝
--with-pcre=/usr/src/lamp/pcre-8.35/ \
--with-zlib=/usr/src/lamp/zlib-1.2.5
make && make install
其中pcre提供了正則表達式功能
zlib提供了壓縮相關的函數庫

啓動nginx

安裝之後通過以下命令啓動nginx
/usr/local/nginx/sbin/nginx

如果提示:
/usr/local/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
需要通過以下步驟解決:

ll /lib/*pcre* 確實沒有找到libpcre.so.1
find / -type f -name *libpcre.so.*
3.添加軟連接

ln -s /lib/libpcre.so.0.0.1 /lib/libpcre.so.1
注: 在有的操作系統上面,安裝pcre後,安裝的位置爲/usr/local/lib/*pcre*

在redhat 64位機器上, nginx可能讀取的pcre文件爲/lib64/libpcre.so.1文件.
改用下面的軟連接:
ln -s /usr/local/lib/libpcre.so.1 /lib64/

測試是否正常提供服務

安裝配置參數(瞭解)

–prefix #nginx安裝目錄,默認在/usr/local/nginx
–pid-path #pid文件位置,默認在logs目錄
–lock-path #lock文件位置,默認在logs目錄
–with-http_ssl_module #開啓HTTP SSL模塊,以支持HTTPS請求。
–with-http_dav_module #開啓WebDAV擴展動作模塊,可爲文件和目錄指定權限
–with-http_flv_module #支持對FLV文件的拖動播放
–with-http_realip_module #支持顯示真實來源IP地址
–with-http_gzip_static_module #預壓縮文件傳前檢查,防止文件被重複壓縮
–with-http_stub_status_module #取得一些nginx的運行狀態
–with-mail #允許POP3/IMAP4/SMTP代理模塊
–with-mail_ssl_module #允許POP3/IMAP/SMTP可以使用SSL/TLS
–with-pcre=../pcre-8.11 #注意是未安裝的pcre路徑
–with-zlib=../zlib-1.2.5 #注意是未安裝的zlib路徑
–with-debug #允許調試日誌
–http-client-body-temp-path #客戶端請求臨時文件路徑
–http-proxy-temp-path #設置http proxy臨時文件路徑
–http-fastcgi-temp-path #設置http fastcgi臨時文件路徑
–http-uwsgi-temp-path=/var/tmp/nginx/uwsgi #設置uwsgi 臨時文件路徑
–http-scgi-temp-path=/var/tmp/nginx/scgi #設置scgi 臨時文件路徑

管理nginx

檢查配置

./nginx -t

啓動

./nginx -c /usr/local/nginx/nginx.conf
-c參數指定了要加載的nginx配置文件路徑. 默認爲安裝配置時指定的配置文件路徑.只能使用絕對

 停止

停止操作是通過向nginx進程發送信號來進行的
步驟1:查詢nginx主進程號
ps -ef | grep nginx
在進程列表裏 面找master進程,它的編號就是主進程號了。

步驟2:發送信號
從容停止Nginx:
kill -QUIT 主進程號
快速停止Nginx:
kill -TERM 主進程號
強制停止Nginx:
pkill -9 nginx

killall nginx


另外, 若在nginx.conf配置了pid文件存放路徑則該文件存放的就是Nginx主進程號,如果沒指定則放在nginx的logs目錄下。有了pid文 件,我們就不用先查詢Nginx的主進程號,而直接向Nginx發送信號了,命令如下:
kill -信號類型(QUIT| TERM) `cat /usr/local/nginx/logs/nginx.pid`

平滑重啓

如果更改了配置就要重啓Nginx,要先關閉Nginx再打開?不是的,可以向Nginx 發送信號,平滑重啓。
平滑重啓命令:
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
或者使用
./nginx -s reload

nginx安裝服務

準備管理腳本

如果想通過以下命令控制nginx

service nginx start
service nginx stop

需要在linux中安裝服務腳本

 

修改配置變量

編輯並且正確配置該腳本中的變量.
主要也就以下兩個地方

使用service命令管理

#拷腳本到/etc/init.d/
cp nginx /etc/init.d/
#修改服務腳本的執行權限
chmod 755 /etc/init.d/nginx

增加開機啓動

#nginx加入服務
chkconfig --add nginx
#nginx 設置爲開機啓動(2345)
/sbin/chkconfig nginx on

參數

#啓動
service nginx start
#關閉
service nginx stop
#重啓
service nginx restart
#狀態
service nginx status
#檢查配置文件
service nginx configtest

3. nginx配置文件詳解

3.1 Nginx的主配置文件概述

3.1.1 認識配置文件

Linux 下基本上每個服務都會有它的主配置文件,該文件會定義服務應該如果去運行, 
使用些什麼參數,啓用些什麼功能,相關會涉及到的一些操作文件在哪,所以主配置文件對 服務是至關重要的。下面我們來分析一下 Nginx 的主配置文件。 
Nginx的主配置文件默認情況下位於/usr/local/nginx/nginx.conf 以下爲Nginx

配置文件一些參數的註釋。 
請先參考該配置文件:


3.1.2 nginx的配置文件結構

nginx.conf由多個塊組成,最外面的塊是main,main包含events和http。
http包含多個upstream和多個server,server又包含多個location

main(全局設置)、server(虛擬主機設置)、upstream(負載均衡服務器設置)和 location(URL匹配特定位置的設置)。

main塊設置的指令將影響其他所有設置;
server塊的指令主要用於指定主機和端口,以及網站路徑;
upstream指令主要用於負載均衡,設置一系列的後端服務器;
location塊用於匹配網頁位置。

這四者之間的關係式:server繼承main,location繼承server,upstream既不會繼承其他設置也不會被繼承。
在這四個部分當中,每個部分都包含若干指令,這些指令主要包含Nginx的主模塊指令、事件模塊指令、HTTP核心模塊指令,同時每個部分還可以使用其他HTTP模塊指令,例如Http SSL模塊、HttpGzip Static模塊和Http Addition模塊等。

 

3.1.3 nginx的全局配置

#指定使用的用戶和組
#user nginx nginx;

#啓動進程,通常設置成和cpu的數量相等
worker_processes 1;

#全局錯誤日誌
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#PID文件--存放進程號的文件
#pid logs/nginx.pid;

 

創建全局配置中nginx需要的運行用戶
groupadd nginx
useradd -g nginx nginx

3.2 events配置

 

#工作模式及連接數上限
events {
#單個後臺worker process進程的最大併發連接數
worker_connections 1024;
#併發總數是 worker_processes 和 worker_connections 的乘積

#Nginx支持如下處理連接的方法(I/O複用方法),這些方法可以通過 use指令指定。 
#use [ kqueue | rtsig | epoll | /dev/poll | select | poll];

use epoll; #使用 epoll(linux2.6的 性能方式 )
}
服務器爲linux時, 請講use epoll打開. 利用linux的內核提供性能優化方案.

可以使用uname -a查看內核版本。

3.3 http的配置

http {
    #Nginx對HTTP服務器相關屬性的配置
    include mime.types;
    default_type application/octet-stream;
    #設定虛擬主機配置 
    server {
        #偵聽80端口
        listen 80;
        #定義使用 www.itsource.cn訪問
        server_name www.itsource.cn;
        location {
        }


        location {
        }
        …..
    }


    server {
    #偵聽80端口
        listen 80;
        #定義使用 www.example.cn訪問
        server_name www.example.cn;
        location {

        }
        location {
        }
        …..
    }

}

include是個主模塊指令,實現對配置文件所包含的文件的設定,可以減少主配置文件的複雜度。類似於Apache中的include方法。
default_type屬於HTTP核心模塊指令,這裏設定默認類型爲二進制流,也就是當文件類型未定義時使用這種方式,例如在沒有配置PHP環境時,Nginx是不予解析的,此時,用瀏覽器訪問PHP文件就會出現下載窗口。
server塊的指令主要用於指定主機和端口(虛擬主機);
location部分主要用於匹配網頁位置,設置不同的功能特徵. 比如:緩存,重定向等..

3.4 location指令

location部分主要用於匹配網頁位置,設置不同的功能特徵. 比如:緩存,重定向等..

 

3.4.1 常見實例

靜態緩存

有擴展名以.gif、.jpg、.jpeg、.png、.bmp、.swf結尾的靜態文件都交給nginx處理,而expires用來指定靜態文件的過期時間,這裏是30天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    root /wwwroot/kunx.org;
    expires 30d;
}

緩存

upload和html下的所有文件都交給nginx來處理,當然,upload和html目錄包含在/var/html/kunx.org目錄中
location ~ ^/(upload|html)/ {
    root /var/html/kunx.org;
    expires 30d;
}

轉發

location是對此虛擬主機下動態網頁的過濾處理,也就是將所有以.php爲後綴的文件都交給本機的8080端口處理
location ~ .*.php$ {
    index index.php;
    proxy_pass http://localhost:8080;
}

 

3.4.2 語法

~      #波浪線表示執行一個正則匹配,區分大小寫
~*    #表示執行一個正則匹配,不區分大小寫
^~    #^~表示普通字符匹配,如果該選項匹配,只匹配該選項,不匹配別的選項,一般用來匹配目錄
=      #進行普通字符精確匹配

實例

location中可以接受一下的語法規則
location = / {
    # 只匹配"/".
    [ configuration A ] 
}


location / {
    # 匹配任何請求,因爲所有請求都是以"/"開始
    # 但是更長字符匹配或者正則表達式匹配會優先匹配
    [ configuration B ] 
}


location ^~ /images/ {
    # 匹配任何以 /images/ 開始的請求,並停止匹配 其它location
    [ configuration C ] 
}


location ~* \.(gif|jpg|jpeg)$ {
    # 匹配以 gif, jpg, or jpeg結尾的請求. 
    # 但是所有 /images/ 目錄的請求將由 [Configuration C]處理. 
    [ configuration D ] 
}

 

優先級:
1.=前綴的指令嚴格匹配這個查詢。如果找到,停止搜索。
2.所有剩下的常規字符串,最長的匹配。如果這個匹配使用^〜前綴,搜索停止。
3.正則表達式,在配置文件中定義的順序。
4.如果第3條規則產生匹配的話,結果被使用。否則,如同從第2條規則被使用。


請求URI例子:
/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/1.gif -> 符合configuration C
/documents/1.jpg ->符合 configuration D

 

 

4. 重寫機制(瞭解)

 4.1 什麼是rewrite

Rewrite就是URL Rewrite,即URL重寫,就是把傳入Web的請求重定向到其他URL的過程。

URL Rewrite最常見的應用是URL僞靜態化,是將動態頁面顯示爲靜態頁面方式的一種技術。比如http://www.123.com/news/index.php?id=123 使用URLRewrite 轉換後可以顯示爲 http://www.123.com/news/123.html

對於追求完美主義的網站設計師,就算是網頁的地址也希望看起來儘量簡潔明快。形如http://www.123.com/news/index.php?id=123的網頁地址,自然是毫無美感可言,而用UrlRewrite技術,你可以輕鬆把它顯示爲 http://www.123.com/news/123.html。


理論上,搜索引擎更喜歡靜態頁面形式的網頁,搜索引擎對靜態頁面的評分一般要高於動態頁面。所以,UrlRewrite可以讓我們網站的網頁更容易被搜索引擎所收錄。 
從安全角度上講,如果在url中暴露太多的參數,無疑會造成一定量的信息泄漏,可能會被一些黑客利用,對你的系統造成一定的破壞,所以靜態化的url地址可以給我們帶來更高的安全性。

4.2 rewrite的命令的作用域和優先級

4.2.1 作用域

作用域:server,location.
rewrite指令可以寫在server和location中.

4.2.2 nginx rewrite指令執行順序

1.執行server塊的rewrite指令(這裏的塊指的是server關鍵字後{}包圍的區域,其它xx塊類似)
2.執行location匹配
3.執行選定的location中的rewrite指令
如果其中某步URI被重寫,則重新循環執行1-3,直到找到真實存在的文件

4.2.3 配置案例


4.3 if指令

4.3.1 if指令的語法

語法:if(condition){...}
默認值:無
作用域:server,location

4.3.2 if指令中使用的邏輯運算符

對給定的條件condition進行判斷。如果爲真,大括號內的rewrite指令將被執行。
if條件(conditon)可以是如下任何內容:
一個變量名;false如果這個變量是空字符串或者以0開始的字符串;
使用= ,!= 比較的一個變量和字符串
是用~, ~*與正則表達式匹配的變量,如果這個正則表達式中包含},;則整個表達式需要用"或'包圍
使用-f ,!-f 檢查一個文件是否存在
使用-d, !-d 檢查一個目錄是否存在
使用-e ,!-e 檢查一個文件、目錄、符號鏈接是否存在
使用-x , !-x 檢查一個文件是否可執行

4.3.3 If指令中可以使用的變量

DDOS洪水攻擊 拒絕服務式攻擊

在匹配過程中可以引用一些Nginx的全局變量,更多的變量請參考
http://wiki.nginx.org/NginxHttpCoreModule 的 Variables 部分


$args, 請求中的參數; 
$document_root, 針對當前請求的根路徑設置值; 
$host, 請求信息中的"Host",如果請求中沒有Host行,則等於設置的服務器名; 
$limit_rate, 對連接速率的限制; 
$request_method, 請求的方法,比如"GET"、"POST"等; 
$remote_addr, 客戶端地址; 
$remote_port, 客戶端端口號; 
$remote_user, 客戶端用戶名,認證用; 
$request_filename, 當前請求的文件路徑名 
$query_string, 與$args相同; 
$scheme, 所用的協議,比如http或者是https 
$server_protocol, 請求的協議版本,"HTTP/1.0"或"HTTP/1.1"; 
$server_addr, 服務器地址,如果沒有用listen指明服務器地址,使用這個變量將發起一次系統調用Ø以取得地址(造成資源浪費); 
$server_name, 請求到達的服務器名; 
$document_uri 與$uri一樣,URI地址;
$server_port, 請求到達的服務器端口號;


4.3.4 if指令實例

匹配訪問的url地址是否是個目錄

 

if (-d $request_filename) { 
    …; 
}

匹配訪問的地址是否以www開頭

if ($host ~* ^www) { 
    …; 
}

 

4.4 rewrite指令

4.4.1 rewrite指令語法

語法:rewrite regex replacement [flag]; 
默認值:無
作用域:server,location,if

 

regex: 請求地址,該地址可以是一個正則表達式
replacement: 重寫地址.
flag: rewrite標記(last,break,redirect,permanent)

4.4.2 flag標記

rewrite 指令根據表達式來重定向URI,或者修改字符串。可以應用於server, location, if環境下。
每行rewrite指令最後應該跟一個flag標記。
支持的flag標記有:
last break redirect permanent


last 相當於Apache裏的[L]標記,表示完成rewrite 
break 本條規則匹配完成後,終止匹配,不再匹配後面的規則 
redirect 返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址 
permanent 返回301永久重定向,瀏覽器地址會顯示跳轉後URL地址

 

last和break的區別

 

last和break標記的區別在於,last標記在本條rewrite規則執行完後,會對其所在的server { … } 標籤重新發起請求,而break標記則在本條規則匹配完成後,停止匹配,不再做後續的匹配。另有些時候必須使用last,比如在使用alias指令時,而使用proxy_pass指令時則必須使用break。

比如:
location /abc/ { 
    rewrite "^/abc/(.*)\.html$" /abc/index.html last; 
}

我們應該將上面的last改成break以避免死循環。

redirect和 permanent區別

redirect和 permanent區別則是返回的不同方式的重定向,對於客戶端來說一般狀態下是沒有區別的。而對於搜索引擎,相對來說301的重定向更加友好,如果我們把一個地址採用301跳轉方式跳轉的話,搜索引擎會把老地址的相關信息帶到新地址,同時在搜索引擎索引庫中徹底廢棄掉原先的老地址。 
使用302重定向時,搜索引擎(特別是google)有時會查看跳轉前後哪個網址更直觀,然後決定顯示哪個,如果它覺的跳轉前的URL更好的話,也許地址欄不會更改,那麼很有可能出現URL劫持的現像。 
我們在做URI重寫時,有時會發現URI中含有相關參數,如果需要將這些參數保存下來,並且在重寫過程中重新引用,我們可以用到 () 和 $N 的方式來解決。

 

4.4.3 set指令

set 指令是用於定義一個變量,並且賦值。應用於server,location,if環境。 
語法格式爲: set $變量名 變量值

4.4.4 return指令

return 指令用於返回狀態碼給客戶端, 應用於server,location,if環境。
語法:
return xxx;

4.4.5 rewrite實例

路徑美化

匹配訪問的url地址是否是個目錄,如果是則自動加個 / 
if (-d $request_filename) { 
    rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 
}


用戶訪問地址爲/uplook/11-22-33.html重寫後真實地址爲 /uplook/11/22/33.html 
location /uplook/ {
    rewrite /uplook/([0-9]+)-([0-9]+)-([0-9]+).html /uplook/$1/$2/$3.html last; 
}

僞靜態

用戶訪問的網址爲www.test.com/php/abc.html 重寫後真實地址是www.test.com/login.php?user=abc

location ~* /php/.*\.html$ { 
    rewrite /php/(.*)\.html /login.php?user=$1 last; 
}

文件重定向

當訪問任意目錄下的whoami.html都重定向到 /who.html
location ~* .*/whoami\.html$ { 
    set $who 'who.html'; 
    rewrite .* /$who break; 
}

訪問控制

如果訪問的 .sh 結尾的文件則返回403操作拒絕錯誤
location ~* .*\.sh$ { 
    return 403; 
}

5. nginx虛擬主機

5.1 什麼是nginx的虛擬主機

虛擬主機是用來映射網站域名和網站代碼文件夾的關係.它可以通過server配置, 每個server表示一個虛擬機主機.

5.2 標準的虛擬主機配置

http {
    #默認的虛擬機主機
    server {
        listen          80 default;
        server_name    localhost;
        access_log      logs/default.access.log main;
        location / {
            index index.html;
            root  /var/www/default/htdocs;
        }
    }


    #www.domain1.com對應的虛擬主機
    server {
        listen          80;
        server_name     www.domain1.com;
        #access_log      logs/domain1.access.log main;
        location / {
            index index.html;
            root  /var/www/domain1.com/htdocs;
        }
    }


    #www.domain2.com對應的虛擬主機
    server {
        listen          80;
        server_name     www.domain2.com;
        access_log      logs/domain2.access.log main;
        location / {
            index index.html;
            root  /var/www/domain2.com/htdocs;
        }
    }
}

5.3 規劃虛擬主機的配置文件

以上全部配置在主配置文件中可能不小心修改掉配置文件導致nginx.conf文件出錯. 可以使用include指令將每個虛擬主機放在一個單獨的配置文件中.
將nginx服務器目錄結構設置爲:
nginx
    nginx.conf
    vhost
        -- www.domain1.com.conf
        -- www.domain2.com.conf
每個.conf結尾的文件中保存一個虛擬主機(server)的配置信息.在nginx.conf中通過include指令包含這些配置文件.

 

在nginx/conf/nginx.conf中的配置:

http {
    #默認的虛擬機主機
    server {
        listen          80 default;
        server_name     _ *;
        access_log      logs/default.access.log main;
        location / {
            index index.html;
            root  /var/www/default/htdocs;
        }
    }
    include vhost/*.conf;
}


在nginx/config/vhost/www.domain1.com.conf中的配置:
server {
        listen          80;
        server_name     www.domain1.com;
        access_log      logs/domain1.access.log main;
        location / {
            index index.html;
            root  /var/www/domain1.com/htdocs;
        }
}
在nginx/config/vhost/www.domain2.com.conf中的配置:
server {
        listen          80;
        server_name     www.domain2.com;
        access_log      logs/domain2.access.log main;
        location / {
            index index.html;
            root  /var/www/domain2.com/htdocs;
        }
}

6. 動靜分離

當用戶請求js,css等靜態資源時有當前nginx服務器處理, 請求php動態腳本代碼時由其他的服務器處理(反向代理).

 

#配置Nginx動靜分離,定義的靜態頁面直接從Nginx發佈目錄讀取。
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ 

    #expires定義用戶瀏覽器緩存的時間爲3天,如果靜態頁面不常更新,可以設置更長,這樣可以節省帶寬和緩解服務器的壓力
    expires      3d; 
}


#動態頁面交給其他服務器處理 
location ~ .*\.(php|jsp|cgi)?$ 

       #發送給其他服務器處理
}

容量符號縮寫
k,K 千字節
m,M 兆字節

時間符號縮寫
ms 毫秒
s 秒
m 分鐘
h 小時
d 日
w 周
M 一個月, 30天
y 年, 365 天

7. 反向代理

7.1 什麼是反向代理

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連的 客戶端,此時代理服務器對外就表現爲一個服務器。

區別於平時使用的VPN,平時使用的VPN是正向代理服務器,是由請求方配置的
反向代理服務器對請求方不可見,就好像請求的服務器就是最終的處理服務器一樣

7.2 兩個概念

web前端服務器: 代理服務器可以作爲前端服務器處理靜態資源
web後端服務器: web前端服務器無法處理的動態請求發送給後臺web服務器處理.

7.3 特點

反向代理又稱爲Web服務器加速,是針對Web服務器提供加速功能的。它作爲代理Cache,但並不針對瀏覽器用戶,而針對一臺或多臺特定Web服務器(這也是反向代理名稱的由來)。代理服務器可以緩存一些web的頁面,降低了web服務器的訪問量,所以可以降低web服務器的負載。web服務器同時處理的請求數少了,響應時間自然就快了。同時代理服務器也存了一些頁面,可以直接返回給客戶端,加速客戶端瀏覽。

靜態緩存

varnish

7.4 反向代理的配置

當用戶訪問php文件時,將該請求交給apache服務器處理php文件
server {
    #偵聽192.168.8.x的80端口
    listen 80;
    server_name www.xianrentiao.cn;

 

    #對php後綴的進行請求
    location ~ .*\.php$ {
        #定義服務器的默認網站根目錄位置
        root /root; 
        #定義首頁索引文件的名稱
        index index.php index.html index.htm;

        #請求轉向apache服務器,apache服務器運行在81端口上
        proxy_pass http://localhost:81;

 

        #以下是一些反向代理的配置可刪除.
        proxy_redirect off;

        #後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        #允許客戶端請求的最大單文件字節數
        client_max_body_size 10m;

        #緩衝區代理緩衝用戶端請求的最大字節數,
        client_body_buffer_size 128k;

        #nginx跟後端服務器連接超時時間(代理連接超時)
        proxy_connect_timeout 90;

        #連接成功後,後端服務器響應時間(代理接收超時)
        proxy_read_timeout 90;

        #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
        proxy_buffer_size 4k;

        #proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設置
        proxy_buffers 4 32k;

        #高負荷下緩衝大小(proxy_buffers*2)
        proxy_busy_buffers_size 64k;

        #設定緩存文件夾大小,大於這個值,將從upstream服務器傳
        proxy_temp_file_write_size 64k; 
    }
}

7.5 可以將代理配置單獨放在一個配置文件中

存放代理配置的nginx/conf/proxy.conf: 其他的server虛擬主機都可以使用該配置.


#以下是一些反向代理的配置可刪除.
proxy_redirect off;

#後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#允許客戶端請求的最大單文件字節數
client_max_body_size 10m;

#緩衝區代理緩衝用戶端請求的最大字節數,
client_body_buffer_size 128k;

#nginx跟後端服務器連接超時時間(代理連接超時)
proxy_connect_timeout 90;

#連接成功後,後端服務器響應時間(代理接收超時)
proxy_read_timeout 90;

#設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffer_size 4k;

#proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設置
proxy_buffers 4 32k;

#高負荷下緩衝大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;

#設定緩存文件夾大小,大於這個值,將從upstream服務器傳
proxy_temp_file_write_size 64k;

 

使用代理配置文件:
server {
    listen 80;
    server_name www.xianrentiao.cn;

    #對php後綴的進行請求
    location ~ .*\.php$ {
        #定義服務器的默認網站根目錄位置
        root /root; 
        #定義首頁索引文件的名稱
        index index.php index.html index.htm;

        #請求轉向apache服務器,apache服務器運行在81端口上
        proxy_pass http://localhost:81;

        #以下是一些反向代理的配置可刪除.
        include proxy.conf;
    }
}

8. 負載均衡(瞭解)

8.1 什麼是負載均衡


 後臺服務器組成了一個服務器集羣(多臺服務器). 有中間服務器(nginx)接受到請求分發給不同的服務器後臺. 該nginx就是一個負載均衡服務器.

8.2 負載均衡的優點

分散後臺服務器的壓力
自動去掉掛掉的後臺服務器
緩存後臺服務器響應內容

 

8.3 負載均衡的分配策略

nginx 的 upstream目前支持 4 種方式的分配 


1. weight 輪詢(默認) 

    指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。
    每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,表示當前server不參與負載,自動剔除。 
      


2. ip_hash 
    每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。  


3. fair(第三方) 
     按後端服務器的響應時間來分配請求,響應時間短的優先分配。  


4. url_hash(第三方)
    按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。

 

8.4 負載均衡配置

在http節點裏添加:


#定義負載均衡設備的 ip及設備狀態 
upstream myServer {

    [ip_hash; | fair; | url_hash;]
    server 127.0.0.1:9090 down; 
    server 127.0.0.1:8080 weight=2; 
    server 127.0.0.1:6060; 
    server 127.0.0.1:7070 backup; 

}


在需要使用負載的server節點下的location節點或者location中的if中添加
proxy_pass http://myServer;

upstream 每個設備的狀態:
down:表示單前的server暫時不參與負載 
weight:默認爲1.weight越大,負載的權重就越大。 
max_fails:允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤 
fail_timeout:max_fails 次失敗後,暫停的時間。 
backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

9. 安裝PHP

 #安裝php5
tar -zxvf php-5.4.42.tar.gz
cd php-5.4.42
#配置
./configure --prefix=/usr/local/php \
--enable-fpm \
--with-config-file-path=/usr/local/php/etc/ \
--with-mysql=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-freetype-dir=/usr/local/freetype \
--with-gd= \
--with-zlib \
--with-libxml-dir=/usr/local/libxml2 \
--with-jpeg-dir=/usr/local/jpeg \
--with-png-dir=/usr/local/libpng \
--enable-mbstring=all \
--enable-mbregex --enable-shared \

--with-pcre-regex \

--with-iconv \

--with-mcrypt \

--with-curl

#編譯和安裝
make && make install

10. PHP-FPM

10.1 什麼是PHP-FPM

PHP-FPM是一個PHP FastCGI管理器軟件,是隻用於PHP的。PHP FastCGI可以解析PHP腳本.在PHP5.3以及以上的版本中集成了PHP-FPM軟件.

10.2 爲什麼要是使用PHP-FPM

nginx本身不能處理PHP,它只是個web服務器,當接收到請求後,如果是php請求,則發給php解釋器處理,並把結果返回給客戶端。

10.3 安裝並且啓動PHP-FPM

10.3.1 安裝

PHP中已經集成了php-fpm,所以安裝好PHP之後在PHP的安裝目錄:
/usr/local/php/sbin/php-fpm 
就是php-fpm的可執行程序.

10.3.2 fpm的配置

#準備配置文件php-fpm.conf
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

#修改配置文件
vi /usr/local/php/etc/php-fpm.conf

 

去掉以下配置前的註釋符號#
pid = run/php-fpm.pid
user = www 
group = www
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35


如果www用戶和組不存在,請創建:
groupadd www 
useradd -g www www

10.3.3 測試php-fpm的配置文件

/usr/local/php/sbin/php-fpm –t

10.3.4 啓動和停止

/usr/local/php/sbin/php-fpm

10.3.5 檢查php-fpm是否啓動

php-fmp默認情況下運行在9000端口上.查看是否存在9000的端口,如果存在說明已經啓動.
netstat –apn | grep 9000

10.3.6 自啓動php-fpm

#從php源代碼文件中拷貝
cp /usr/local/src/php-5.4.45/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

#添加執行權限
chmod +x /etc/inti.d/php-fpm

# php-fpm加入服務
chkconfig --add php-fpm
# 設置自啓動
chkconfig php-fpm on
也可以通過服務啓動和關閉
service php-fpm restart
service php-fpm stop
service php-fpm start

10.4 nginx使用php-fpm處理php

在一個虛擬主機中加入一下配置即可:


當請求php文件時交給
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;
}


在/usr/local/nginx/html下創建index.php文件,輸入如下內容
<?php
    echo phpinfo();
?>
直接訪問index.php是否能夠訪問到. 如果能夠訪問到說明配置成功.

 

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