Nginx

Nginx進(jìn)階

??Nginx主要作用:隱藏真實(shí)服務(wù)器信息內(nèi)容,用戶在請求的永遠(yuǎn)是nginx監(jiān)聽的端口米同,不會(huì)訪問到真實(shí)服務(wù)器的IP,黑客攻擊的時(shí)候是nginx服務(wù)心俗,nginx服務(wù)癱瘓了傻铣,重啟就行渡冻。安全性的防患凝垛,和并發(fā)問題(轉(zhuǎn)發(fā):負(fù)載均衡),日志解析七兜。

1. Nginx快速入門

1.1 Nginx簡介

?? Nginx(發(fā)音同 engine x)是一款基于異步框架的輕量級(jí)/高性能的Web 服務(wù)器/反向代理服務(wù)器/緩存服務(wù)器[靜態(tài)文件服務(wù)]/電子郵件(IMAP/POP3)代理服務(wù)器俗冻,并在一個(gè)BSD-like 協(xié)議下發(fā)行。由俄羅斯的程序設(shè)計(jì)師Igor Sysoev(伊戈?duì)枴べ愃饕?所開發(fā)梗肝,最初供俄國大型網(wǎng)站Rambler.ru及搜尋引擎Rambler使用榛瓮。

?? Web 服務(wù)器【apache+php】

Nginx特點(diǎn)

??優(yōu)點(diǎn):
?? ?? * 高并發(fā)量:基于 epoll/kqueue 模型開發(fā),支持高并發(fā)量巫击,官方說其支持高達(dá) 5w 并發(fā)連接數(shù)的響應(yīng)
?? ?? * 內(nèi)存消耗少:善于處理靜態(tài)文件禀晓,相較于其他web(比如:apache),占用更少的內(nèi)存及資源
?? ?? * 簡單穩(wěn)定:配置簡單(一個(gè)conf文件),運(yùn)行簡單(nginx命令),而且運(yùn)行穩(wěn)定
?? ?? * 模塊化程度高:功能模塊插件化設(shè)計(jì)坝锰,可以自由配置相應(yīng)的功能粹懒。[如:負(fù)載均衡]
?? ?? * 支持Rwrite重寫規(guī)則:能夠根據(jù)域名、URL等請求關(guān)鍵點(diǎn)顷级,實(shí)現(xiàn)定制化的高質(zhì)量分發(fā)凫乖。
?? ?? * 低成本:Nginx的負(fù)載均衡功能很強(qiáng)大而且免費(fèi)開源,相較于幾十萬的硬件負(fù)載均衡器成本相當(dāng)?shù)汀?br> ?? ?? * 支持多系統(tǒng):Nginx代碼完全用C語言從頭寫成弓颈,可以在各系統(tǒng)上編譯并使用帽芽。

?? 缺點(diǎn):
?? ?? * 動(dòng)態(tài)處理差:nginx善于處理靜態(tài)文件,但是處理動(dòng)態(tài)頁面相較于Apache之類重量級(jí)的web軟件能力稍欠缺翔冀。
?? ?? * rewrite弱:雖然nginx支持rewrite功能多导街,但是相較于Apache之類重量級(jí)的web軟件能力稍欠缺。

1.2 Nginx部署

Nginx軟件部署

安裝Nginx軟件

sudo apt-get install nginx
方法一:快
apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev 
apt-get install nginx -y
方法二:定制標(biāo)準(zhǔn)高
編譯安裝纤子,請關(guān)注后續(xù)"shell自動(dòng)化運(yùn)維"課程
檢查效果:
netstat -tnulp | grep nginx
瀏覽器查看
服務(wù)相關(guān)命令
systemctl start|stop|reload|... nginx
/etc/init.d/nginx start|stop|reload|...
/usr/sbin/nginx ...
nginx -V
Nginx -t # 測試nginx 
Nginx -s reload # 平穩(wěn)的重啟服務(wù)

移除相關(guān)命令:
查看和nginx相關(guān)軟件
dpkg --get-selections|grep nginx
移除nginx搬瑰,包括相關(guān)文件
apt-get --purge remove nginx
apt-get --purge remove nginx-common
apt-get --purge remove nginx-core

Nginx配置簡介

nginx軟件目錄:
工作目錄:/etc/nginx
執(zhí)行文件: /usr/sbin/nginx
日志目錄:/var/log/nginx
啟動(dòng)文件:/etc/init.d/nginx
web目錄:/var/www/html/,首頁文件是index.nginx-debian.html
/usr/share/nginx/html/ 首頁文件是index.html
6-全局配置段.png

nginx配置文件:

默認(rèn)文件:
/etc/nginx/nginx.conf
/etc/nginx/conf.d/項(xiàng)目.conf # 項(xiàng)目配置文件
其他目錄:
/etc/nginx/{sites-available/sites-enabled/conf.d}
文件結(jié)構(gòu):
      全局配置段
      http配置段
          server配置段           項(xiàng)目或者應(yīng)用
              location配置段     url配置
6-nginx訪問原理.png

1.3 配置詳解

全局配置段

主要是全局性的和服務(wù)級(jí)別的屬性配置控硼,常見的主要有以下幾種設(shè)置:

user                  設(shè)置使用用戶(worker)
worker_processes      進(jìn)行增大并發(fā)連接數(shù)的處理 跟cpu保持一致 八核設(shè)置八個(gè)
error_log                 nginx的錯(cuò)誤日志
pid                   nginx服務(wù)啟動(dòng)時(shí)候pid 
events                    定義事件相關(guān)的屬性
  worker_connections  一個(gè)進(jìn)程允許處理的最大連接數(shù)
  use                     定義使用的內(nèi)核模型

http配置段

主要配置server通用的一些配置
include mime.types;                       # 文件擴(kuò)展名與文件類型映射表
default_type application/octet-stream;        # 默認(rèn)文件類型
sendfile on;                              # 開啟高效文件傳輸模式泽论。
autoindex on;                                 # 開啟目錄列表訪問,合適下載服務(wù)器象颖,默認(rèn)關(guān)閉佩厚。
tcp_nopush on;                                # 防止網(wǎng)絡(luò)阻塞
tcp_nodelay on;                           # 防止網(wǎng)絡(luò)阻塞
keepalive_timeout 120;                        # 長連接超時(shí)時(shí)間,單位是秒
gzip on;                                  # 開啟gzip壓縮輸出

Server常見配置屬性 【創(chuàng)建子集文件(/etc/nginx/conf.d)说订,書寫項(xiàng)目的配置信息】
常見樣式

server {
    listen 端口;
    server_name 主機(jī)名;
    ...
}

server配置段最重要的屬性是listen和server_name抄瓦。它們都是用于匹配并處理請求的潮瓶。

listen屬性

??作用:定義Server監(jiān)聽的ip和port,當(dāng)ip/port匹配時(shí)候才進(jìn)行下一步匹配
??表現(xiàn)形式:默認(rèn)監(jiān)聽:80端口

形式 描述 示例 完整示例
IP:Port 地址精確表示樣式 listen 10.10.10.10:99 listen 10.10.10.10:99
IP 自動(dòng)監(jiān)聽 IP:80地址 listen 10.10.10.10 listen 10.10.10.10:80
Port 自動(dòng)監(jiān)聽 全地址:Port listen 99或 [::]:99 listen 0.0.0.0:99
default_server 自動(dòng)使用默認(rèn)的地址 listen default_server listen localhost:80

??使用原則:
???? 首先將所有樣式補(bǔ)全成IP:Port,然后匹配,匹配Server多钙姊,那么接著使用Server_name匹配

server_name屬性
??作用:定義Server監(jiān)聽的域名毯辅,當(dāng)域名匹配時(shí)候才進(jìn)行下一步操作
?? 表現(xiàn)形式:

格式 完整樣式 前綴正則樣式 后綴正則樣式 禁止非法域名或IP
形式 www.example.com *.example.com www.example.* _

??使用原則:
????優(yōu)先使用完整樣式,然后使用前綴正則樣式,最后使用后綴正則樣式,如果正則樣式相同的時(shí)候,匹配最長,否則就走非法規(guī)則。
????非法域名/IP煞额,表示請求到該主機(jī)上一個(gè)不存在的IP或者域名

root屬性
??作用:定義Server相應(yīng)請求的html文件所在路徑
??表現(xiàn)形式:
????root /var/www/html;

index屬性
?? 作用:定義響應(yīng)請求后返回的文件名稱或格式
?? 表現(xiàn)形式:
????index index.html index.htm index.nginx-debian.html;

return屬性
??作用:定義響應(yīng)請求后返回的http狀態(tài)碼
??表現(xiàn)形式:
????return 444;

location常見配置屬性
??location主要是根據(jù)Server匹配到的請求路徑和關(guān)鍵字去響應(yīng)和處理思恐。
??語法:

location optional_modifier location_match { ... } 
location @name { ... }

??其中:optional_modifier是匹配條件,location_match是匹配的樣式膊毁,{}是要執(zhí)行的操作胀莹。匹配條件主要有兩種:正則/前綴字符。

匹配規(guī)則

類型 含義 匹配方式 優(yōu)先級(jí) 樣式
=/路徑 精確匹配 前綴 1 l ocation = /image {}
~ 優(yōu)先匹配 前綴 2 location ~ /page {}
@ 內(nèi)部重定向 前綴 location @name {}
空 / 通用匹配 前綴 3 location / {}

使用原則:
?? 前提:根據(jù)請求url婚温,獲取uri即除了域名/IP之外的部分描焰,用于location匹配
??如果有精確匹配,即 =/路徑栅螟,找到匹配項(xiàng)后荆秦,結(jié)束匹配。
????location = 路徑 {} 或者 location 完整路徑 {}
??如果有優(yōu)先匹配力图,即 ~步绸,找到匹配項(xiàng)后,結(jié)束匹配吃媒。
????location ~ 路徑

??@name示例

@用來定義一個(gè)命名location瓤介。主要用于內(nèi)部重定向,不能用來處理正常的請求晓折。其用法如下:
location / {
   try_files $uri $uri/ @custom
}
location @custom {
   # ...do something
   # custom 命名的 location中不能再嵌套其它的命名location
}

??關(guān)于URL尾部的/有如下注意事項(xiàng):
??1. location中的location_match字符有無"/"不受影響惑朦。/user/等同/user。
??2. 對(duì)于訪問網(wǎng)站域名(http://sswang.com/)漓概,尾部有無"/"不受影響漾月。因?yàn)闉g覽器會(huì)自動(dòng)補(bǔ)全"/"。
??3. 對(duì)于訪問網(wǎng)站域名后面的路徑(http://sswang.com/other/)胃珍。尾部的"/"很重要梁肿。
????URL尾部的"/"表示目錄,沒有"/"表示文件觅彰,而且文件找不到的話吩蔑,會(huì)發(fā)生重定向。
??????/other/:表示服務(wù)器會(huì)自動(dòng)去該目錄下找對(duì)應(yīng)的默認(rèn)文件填抬。
??????/other:表示服務(wù)器會(huì)先去找other文件烛芬,找不到的話會(huì)將other當(dāng)成目錄,重定向到/other/,去該目錄下找默認(rèn)文件赘娄。

location常見動(dòng)作:
?? 在location內(nèi)部常用的功能屬性非常多仆潮,常見的基本屬性、臨時(shí)跳轉(zhuǎn)遣臼、訪問控制性置、目錄列表等。
?? 基本屬性

location / {
      root   /var/www/html;                   # 指定響應(yīng)請求的文件所在路徑
      index  index.php index.html index.htm;  # 指定響應(yīng)請求的默認(rèn)文件名稱
      expires 7d;                             # 指定響應(yīng)請求的文件過期時(shí)間揍堰,一般用于靜態(tài)文件
      try_files $uri $uri/ =404;              # 如果root指定的路徑下有查找的文件鹏浅,就返回,否則報(bào)錯(cuò)
}

??臨時(shí)跳轉(zhuǎn)

location = /test/ {
    return 302 http://sswang.com/;            # 訪問舊url的時(shí)候屏歹,臨時(shí)跳轉(zhuǎn)到新url隐砸,兩個(gè)url均不失效 
}

??訪問控制

location /nginx-status {
    stub_status on;                       # 開啟nginx的狀態(tài)頁面,默認(rèn)關(guān)閉
    allow 192.168.8.14;                       # 允許的訪問地址
    deny all;                             # 其他拒絕
}
注意:
  該功能依賴于ngx_http_stub_status_module 模塊(默認(rèn)沒有安裝西采,需要定制化安裝)

??目錄列表

location /upload {
    alias   /var/www/upload;      # 指定查看文件列表路徑(絕對(duì)路徑)
    autoindex on;                     # 開啟目錄自動(dòng)索引
    autoindex_exact_size off;     # 默認(rèn)on凰萨,顯示文件確切大小(bytes)。off表示顯示文件的大概大小(kB/MB/...)
    autoindex_localtime on;       # 默認(rèn)off械馆,顯示的文件時(shí)間為GMT時(shí)間。on表示顯示文件的服務(wù)器時(shí)間
}
注意:
  該alias指定的目錄下武通,不允許出現(xiàn)index屬性指定的文件霹崎。

location核心動(dòng)作
??Nginx的配置語法靈活,可控制度非常高冶忱。在0.7以后的版本中加入了一個(gè)try_files指令尾菇,配合命名location,可以部分替代原本常用的rewrite配置方式囚枪,提高解析效率派诬。
指令語法

try_files file ... uri
try_files file ... =code

??作用:
????響應(yīng)時(shí)按順序查找file,找到則返回file內(nèi)容链沼,否則的話進(jìn)行內(nèi)部重定向(uri)或返回狀態(tài)碼(code)默赂。

2. Nginx進(jìn)階知識(shí)

正向代理:針對(duì)人群:客戶端(用戶)。用戶訪問網(wǎng)站括勺,服務(wù)器可以獲得用戶請求IP地址缆八。
??黑客:請求正向代理服務(wù)器,正向代理服務(wù)器發(fā)出請求疾捍。隱藏客戶端的信息奈辰,服務(wù)器不知道真實(shí)客戶端的IP地址。
反向代理:針對(duì)人群:服務(wù)器乱豆,服務(wù)器可以屏蔽IP地址奖恰。隱藏web服務(wù)器的信息,防止別人進(jìn)行攻擊。
??服務(wù)器:服務(wù)器瑟啃。服務(wù)器訪問反向代理服務(wù)器趾徽,客戶請求是訪問的是反向代理服務(wù)器IP,防止攻擊翰守。
??將用戶的請求孵奶,轉(zhuǎn)發(fā)給反向代理服務(wù)器。

2.1 反向代理【轉(zhuǎn)發(fā)操作】

代理是什么蜡峰?
??簡單來說了袁,我找一個(gè)中間人,代替我去做一件事情湿颅,只要他給我結(jié)果就可以载绿。
??代理一般分為兩種:正向代理、反向代理
正向代理&反向代理
示意圖


示意圖.png

區(qū)別
??從用途上來講:
????正向代理-為局域網(wǎng)客戶端向外訪問Internet服務(wù)油航≌赣梗可以使用緩沖特性減少網(wǎng)絡(luò)使用率。
????反向代理-為局域網(wǎng)服務(wù)器向外提供Internet服務(wù)谊囚∨孪恚可以使用負(fù)載平衡提高客戶訪問量。還可以基于高級(jí)URL策略和管理技術(shù)對(duì)服務(wù)進(jìn)行高質(zhì)量管控镰踏。

??從安全性來講:
????正向代理-必須采取安全措施確保內(nèi)網(wǎng)客戶端通過它訪問外部網(wǎng)站函筋。隱藏客戶端的身份
????反向代理-對(duì)外提供服務(wù)是透明的,客戶端并不知道自己訪問的是一個(gè)代理奠伪。隱藏服務(wù)端的身份

nginx 代理模塊
官方介紹
??官方資料:http://www.nginx.cn/doc/standard/httpproxy.html
??官方的代理屬性很多跌帐,我們主要介紹proxy_pass和proxy_set_header屬性
??官方代碼示例

location / {
: proxy_pass        http://localhost:8000;        # 設(shè)定請求跳轉(zhuǎn)后的地址,可以使用hostname或IP:Port形式
: proxy_set_header  X-Real-IP  $remote_addr;  # 后端請求攜帶原始請求的真實(shí)IP地址
}

??屬性詳解:
????proxy_pass 指令設(shè)置被代理服務(wù)器的地址和被映射的URI绊率,地址可以使用主機(jī)名或IP加端口號(hào)的形式

proxy_pass關(guān)鍵點(diǎn)
??proxy_pass后面的路徑最后的/作用很重要!!!
??示例代碼:

location /html/ {
  1 proxy_pass http://proxy.com; 
    2 proxy_pass http://proxy.com/;
}

??假設(shè)我們訪問的url是 http://domain.com/html/test.js谨敛,如何理解上述兩種proxy_pass的區(qū)別呢?

對(duì)于 1 來說 proxy.com后面沒有"/"滤否,表示"/html/" 請求(包括自己)后續(xù)的路徑及其參數(shù)等關(guān)鍵字都由http://a.com/來處理脸狸,代理后的樣式如下:
http://proxy.com/html/test.js
對(duì)于 2 來所 proxy.com后面有"/",表示"/html/" 請求后續(xù)的路徑及其參數(shù)等關(guān)鍵字都由http://a.com/來處理顽聂,代理后的樣式如下:
http://proxy.com/test.js

nginx代理實(shí)踐
代理的配置文件

~# vim /etc/nginx/conf.d/proxy.conf 
server {
  listen 192.168.8.14:80;
  server_name www.sswang.com;
  location / {
    proxy_pass http://192.168.8.14:9999/hello/;
  }
}

后端服務(wù)配置文件

~# vim /etc/nginx/conf.d/hello.conf 
server {
  listen 192.168.8.14:9999;
  location /hello/ {
    alias /var/www/html/hello/;
    try_files $uri $uri/ =404;
  } 
}

準(zhǔn)備后端服務(wù)文件

mkdir -p /var/www/html/hello/
echo '<h1>proxy_backend</h1>' > /var/www/html/hello/index.html

檢查nginx配置后重載服務(wù)

/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx

查看效果


查看效果.png

2.2 負(fù)載均衡

負(fù)載均衡是什么肥惭?
??我們之前使用proxy_pass的方式實(shí)現(xiàn)了nginx代理請求到后端的效果,隨著我們的網(wǎng)站訪問量越來越多紊搪,一個(gè)后端就不現(xiàn)實(shí)了蜜葱,那么接下來我們應(yīng)該如果在訪問量日漸增大的情況下,滿足線上業(yè)務(wù)的穩(wěn)定呢耀石?
??解決方法就是:負(fù)載均衡
??負(fù)載均衡簡單說來人多力量大牵囤,打群架爸黄。
??在nginx中的負(fù)載均衡主要有兩種:四層負(fù)載(IP:Port)、七層負(fù)載(http://xxx)

nginx upstream模塊
官方介紹
??官方資料:http://www.nginx.cn/doc/standard/httpupstream.html
??官方的代理屬性很多揭鳞,我們主要介紹upstream和ip_hash屬性
??官方代碼示例

upstream backend  {
  server backend1.example.com weight=5;
  server backend2.example.com:8080;
  server unix:/tmp/backend3;
}
 
server {
  location / {
    proxy_pass  http://backend;
  }
}

??屬性詳解:
????upstream 主要是定義一個(gè)后端服務(wù)地址的集合列表炕贵,每個(gè)后端服務(wù)使用一個(gè)server命令表示
???? upstream {} 和 Server {} 兩部分內(nèi)容屬于平級(jí)關(guān)系。

后端服務(wù)狀態(tài)
??在upstream模塊中野崇,可以使用server命令指定后端服務(wù)器的地址称开,同時(shí)還可以設(shè)置后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài),常用的狀態(tài)有以下幾種:
?? down: 表示當(dāng)前server主機(jī)暫時(shí)不參與負(fù)載均衡乓梨。
??backup:后備主機(jī)鳖轰,當(dāng)所有非backup機(jī)器出現(xiàn)故障或者繁忙的時(shí)候,才會(huì)請求backup機(jī)器扶镀。
??max_fails:允許請求的最大失敗數(shù)蕴侣,默認(rèn)為1,配合fail_timeout一起使用
?? fail_timeout:經(jīng)歷max_fails次失敗后臭觉,暫停服務(wù)的時(shí)間昆雀,默認(rèn)為10s。

nginx負(fù)載均衡實(shí)踐【輪詢蝠筑、加權(quán)狞膘、ip_hash】
負(fù)載均衡配置文件

~# vim /etc/nginx/conf.d/upstream.conf
upstream backends {
  server 192.168.8.14:10086;
  server 192.168.8.14:10087;
  server 192.168.8.14:10088;
}
server {
  listen 80;
  server_name localhost;
  location / {
    proxy_pass http://backends;
  }
}

后端代理配置文件

~# vim /etc/nginx/conf.d/backend.conf
server {
  listen 192.168.8.14:10086;
  location / {
    root /var/www/html/hello/;
    try_files $uri $uri/ =404;
  }
}
server {
  listen 192.168.8.14:10087;
  location / {
    root /var/www/html/nihao/;
    try_files $uri $uri/ =404;
  }
}
server {
  listen 192.168.8.14:10088;
  location / {
    root /var/www/html/huanying/;
    try_files $uri $uri/ =404;
  }
}

準(zhǔn)備后端服務(wù)文件

mkdir -p /var/www/html/hello/
echo '<h1>backend_hello</h1>' > /var/www/html/hello/index.html
mkdir -p /var/www/html/nihao/
echo '<h1>backend_nihao</h1>' > /var/www/html/nihao/index.html
mkdir -p /var/www/html/huanying/
echo '<h1>backend_huanying</h1>' > /var/www/html/huanying/index.html

檢查nginx配置后重載服務(wù)

/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx

查看效果

~# for i in {1..100};do curl http://192.168.8.14;done
<h1>backend_hello</h1>
<h1>backend_nihao</h1>
<h1>backend_huanying</h1>
...
<h1>backend_hello</h1>
<h1>backend_nihao</h1>
<h1>backend_huanying</h1>

負(fù)載均衡調(diào)度算法
??官方資料:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#example
??Nginx提供的負(fù)載均衡策略有兩種:
???? 內(nèi)置策略:nginx自帶的算法
????雨露均沾型:輪訓(xùn)、加權(quán)輪訓(xùn)菱肖、哈希
????定向服務(wù)型:ip_hash客冈、least_conn、cookie稳强、route、lean和悦、
????商業(yè)類型:ntlm退疫、least_time、queue鸽素、stick
??擴(kuò)展策略:各種結(jié)合業(yè)務(wù)場景自定義的算法或者第三方算法
????自定義算法
????第三方算法:fair褒繁、url_hash
??常用算法簡介:

輪詢(默認(rèn)):請求按順序逐一分配到不同的后端服務(wù)器。
weight:指定輪詢權(quán)重馍忽,值越大棒坏,分配到的幾率就越高,適用于后端服務(wù)器性能不均衡情況遭笋。
ip_hash:按訪問IP的哈希結(jié)果分配請求坝冕,分配后訪客訪問固定后端服務(wù)器,有效的解決動(dòng)態(tài)網(wǎng)頁會(huì)話共享問題瓦呼。
fair:基于后端服務(wù)器的響應(yīng)時(shí)間來分配請求喂窟,響應(yīng)時(shí)間短的優(yōu)先分配。
url_hash:按訪問URL的哈希結(jié)果分配請求,使同URL定向到同一臺(tái)后端服務(wù)器磨澡,可提高后端緩存服務(wù)器的效率碗啄。

加權(quán)輪訓(xùn)實(shí)踐
修改負(fù)載均衡配置文件

~# vim /etc/nginx/conf.d/upstream.conf
upstream backends {
  server 192.168.8.14:10086 backup;
  server 192.168.8.14:10087 weight=1;
  server 192.168.8.14:10088 weight=2;
}
...

檢查nginx配置后重載服務(wù)

/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx

查看效果

~# for i in {1..100};do curl http://192.168.8.14;done
<h1>backend_nihao</h1>
<h1>backend_huanying</h1>
<h1>backend_huanying</h1>
...
<h1>backend_nihao</h1>
<h1>backend_huanying</h1>
<h1>backend_huanying</h1>

ip_hash實(shí)踐
修改負(fù)載均衡配置文件

~# vim /etc/nginx/conf.d/upstream.conf
upstream backends {
  ip_hash;
  server 192.168.8.14:10086 ;
  ...
}
...

檢查nginx配置后重載服務(wù)

/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx

查看效果

~# for i in {1..100};do curl http://192.168.8.14;done
<h1>backend_huanying</h1>
...
<h1>backend_huanying</h1>

2.3 日志解析

日志功能簡介
日志簡介 Logging Settings
??Nginx默認(rèn)提供了兩個(gè)日志文件 access.log和error.log,通過access.log可以得到用戶請求的相關(guān)信息稳摄;通過error.log可以獲取某個(gè)web服務(wù)故障或其性能瓶頸等信息稚字。
??而且nginx的日志支持定制化格式,這樣我們就可以根據(jù)實(shí)際的業(yè)務(wù)情況更好的高效工作厦酬。最常見的場景就是獲取客戶端的IP胆描,記錄用戶訪問量。
??官方介紹:http://nginx.org/en/docs/http/ngx_http_log_module.html
基本配置

# cat /etc/nginx/nginx.conf -n
    40        access_log /var/log/nginx/access.log;
    41        error_log /var/log/nginx/error.log;
注意:
  nginx日志屬性設(shè)置的完整格式是: 
      屬性名稱 access_log 
      存儲(chǔ)位置 /var/log/nginx/access.log
          日志格式 位置為空表示使用默認(rèn)的combined 日志格式弃锐。它是通過log_format設(shè)置的

默認(rèn)日志格式

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';
注意:
log_format是有一批nginx內(nèi)置變量組合而成的袄友。

日志樣式:

# tail /var/log/nginx/access.log
192.168.8.14 - - [12/Nov/2018:08:24:18 -0800] "GET /favicon.ico HTTP/1.0" 404 580 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"

nginx常用內(nèi)置變量
?? nginx常用的內(nèi)置變量主要是用來分析日志中的http記錄的,我們可以根據(jù)內(nèi)置的變量精確的獲取相關(guān)的信息
默認(rèn)變量

$remote_addr      前一臺(tái)主機(jī)的ip地址霹菊,不一定是真實(shí)的客戶端IP
$remote_user      用于記錄遠(yuǎn)程客戶端的用戶名稱(一般為“-”)
$time_local           用于記錄訪問時(shí)間和時(shí)區(qū)
$request          用于記錄請求的url以及請求方法
$status               響應(yīng)狀態(tài)碼剧蚣,例如:200成功、404頁面找不到等旋廷。
$body_bytes_sent  給客戶端發(fā)送的文件主體內(nèi)容字節(jié)數(shù)
$http_referer     可以記錄用戶是從哪個(gè)鏈接訪問過來的
$http_user_agent  用戶所使用的代理(一般為瀏覽器)

其他常用變量

$request_uri      包含請求參數(shù)的原始URI鸠按,不包含主機(jī)名
$uri              不帶請求參數(shù)的當(dāng)前URI,不包含主機(jī)名
$http_x_forwarded_for 可以記錄客戶端IP饶碘,通過代理服務(wù)器來記錄客戶端的ip地址
$http_x_real_ip       可以記錄客戶端IP目尖,通過代理服務(wù)器來記錄客戶端的ip地址
$args                 這個(gè)變量等于請求行中的參數(shù),同$query_string
$host                 請求主機(jī)頭字段扎运,否則為服務(wù)器名稱瑟曲。
$scheme           HTTP方法(如http,https)
$document_uri         與$uri相同
$document_root        當(dāng)前請求文件配置文件中html的根目錄即root值
$request_filename     當(dāng)前請求的文件路徑豪治,由root或alias指令與URI請求生成

示例:

例:http://localhost:10086/sswang1/sswang2/test.txt
$host             localhost
$server_port      10086
$request_uri      /sswang1/sswang2/test.txt
$document_uri     /sswang1/sswang2/test.txt
$document_root        /var/www/html
$request_filename /var/www/html/sswang1/sswang2/test.txt

自定義日志實(shí)踐
需求:
??基于代理方式訪問app1應(yīng)用洞拨,日志存放在/var/logs/nginx/app1/access.log,要求能從日志中獲取客戶端的IP地址
??因?yàn)槭谦@取代理前面客戶端的真實(shí)IP负拟,需要nginx開啟 --with-http_realip_module 功能烦衣,使用nginx -V來檢查,ubuntu默認(rèn)安裝的已經(jīng)開啟了該功能掩浙。

  1. 設(shè)置日志格式
 ~# vim /etc/nginx/nginx.conf
  ##
  # Logging Settings
  ##
        log_format proxy_format '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent "$http_referer"'
                    '"$http_user_agent" "$http_x_real_ip" "$http_x_forwarded_for"';

2.負(fù)載均衡配置文件

~# vim /etc/nginx/conf.d/upstream.conf
upstream backends {
  server 192.168.8.14:10086;
}
server {
  listen 80;
  server_name localhost;
  location / {
    proxy_pass http://backends;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

3.后端代理配置文件

~# vim /etc/nginx/conf.d/backend.conf
server {
  listen 192.168.8.14:10086;
  root /var/www/html/app1/;
  access_log /var/log/nginx/app1/access.log proxy_format;
  real_ip_header X-Forwarded-For; 
  set_real_ip_from 192.168.0.0/16; 
  real_ip_recursive on;
  location / {
    try_files $uri $uri/ =404;
  }
}

4.準(zhǔn)備后端服務(wù)文件

mkdir -p /var/www/html/app1/
echo '<h1>backend_app1</h1>' > /var/www/html/app1/index.html
mkdir /var/log/nginx/app1 -p

5.檢查nginx配置后重載服務(wù)

/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx

6.查看效果

在多臺(tái)主機(jī)上執(zhí)行如下命令
curl http://192.168.8.14

7.查看日志:

app1日志
192.168.8.1 - - [12/Nov/2018:18:28:46 -0800] "GET / HTTP/1.0" 200 22 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" "192.168.8.1" "192.168.8.1"
192.168.8.14 - - [12/Nov/2018:18:29:30 -0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.47.0" "192.168.8.14" "192.168.8.14"
192.168.8.15 - - [12/Nov/2018:18:31:43 -0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.29.0" "192.168.8.15" "192.168.8.15"
注意:
因?yàn)槲覀兊奶摂M機(jī)使用的是nat網(wǎng)絡(luò)模型花吟,所以我們用外部的宿主機(jī)來訪問的話,是通過VMnat8網(wǎng)卡IP來訪問nginx代理的厨姚,所以記錄的是192.168.8.1

注意:
??如果生產(chǎn)中出現(xiàn)了多級(jí)代理衅澈,
????在第一層代理上添加 proxy_set_header X-Real-IP remote_addr;屬性 &emsp;&emsp;&emsp;&emsp;在所有代理上必須添加 proxy_set_header X-Forwarded-Forproxy_add_x_forwarded_for;屬性
????真實(shí)主機(jī)上使用 real_ip_header X-Forwarded-For;屬性

2.4 URL重寫

??經(jīng)過上面反向代理和負(fù)載均衡的學(xué)習(xí),我們知道Nginx可以基于這些方法實(shí)現(xiàn)比較好的分發(fā)請求的效果遣蚀,而Nginx還有一個(gè)非常強(qiáng)大的精確分發(fā)請求的功能:Rewrite
URL重寫簡介
使用場景
??根據(jù)開發(fā)功能需求定制用戶瀏覽的URL矾麻,訪問起來更規(guī)范合理纱耻,亦方便互聯(lián)網(wǎng)搜索引擎搜錄網(wǎng)站內(nèi)容
??結(jié)合nginx內(nèi)置變量分析用戶請求信息,進(jìn)行URL定制险耀,達(dá)到用戶請求的精確分發(fā)
??方便企業(yè)動(dòng)態(tài)調(diào)整項(xiàng)目URL,特別是偽靜態(tài)處理和項(xiàng)目整體更新(域名)

Rewrite 作用
?? rewrite 指令的作用是實(shí)現(xiàn) URL 地址重寫(或跳轉(zhuǎn))弄喘。Nginx 的 rewrite 規(guī)則需要 PCRE 軟件的支持,即通過 Perl 兼容正則表達(dá)式語法進(jìn)行規(guī)則匹配甩牺。

Rewrite 語法
??rewrite regex replacement [flag];
??語法詳解
????rewrite 指令
????regex 正則表達(dá)式蘑志,用于匹配舊的 URL 地址
????replacement 重寫/跳轉(zhuǎn)到新的 URL 地址
????[flag] 標(biāo)記符號(hào)--重寫類型
????last 本條規(guī)則匹配完成后,繼續(xù)向下匹配新的location URI規(guī)則贬派,用于Server/if配置段
????break 本條規(guī)則匹配完成即終止急但,不再匹配后面的任何規(guī)則,一般用于Location配置段
????redirect 返回302臨時(shí)重定向搞乏,瀏覽器地址會(huì)顯示跳轉(zhuǎn)后的URL地址波桩,默認(rèn)屬性
????permanent 返回301永久重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址

??regex 常用正則表達(dá)式說明

字符            描述                  字符          描述                  字符          描述
\         轉(zhuǎn)義字符            \d          匹配數(shù)字                [c]         匹配單個(gè)字符c
^         錨定首字符           {n}         重復(fù)n次                [a-z]       匹配a-z間任一小寫字母
$         錨定尾字符           {n,}        重復(fù)>=n次          [^\/]       匹配非/之外的任意字符
*         匹配前面的字符>=0次请敦。如"it*"能匹配"i"及"it"镐躲、"itt"
+         匹配前面的字符>=1次。如"it+"能匹配"it"及"itt"侍筛、"ittt"萤皂,但不能匹配"i"
?         匹配前面的字符0/1次,例如"do(es)?"能匹配"do"或者"does"匣椰,"?"等效于"{0,1}"
.         匹配除"\n"之外的任何單個(gè)字符裆熙,若要匹配包括"\n"在內(nèi)的任意字符,請使用諸如"[.\n]"之類的模式禽笑。
(pattern) 匹配括號(hào)內(nèi)pattern內(nèi)容入录,常用$0...$9屬性整體獲取小括號(hào)中的內(nèi)容,要匹配圓括號(hào)字符需要\(Content\)

簡單示例

server {
    # 訪問 /last.html 的時(shí)候佳镜,頁面內(nèi)容重寫到 /index.html 中
    rewrite /last.html /index.html last;
    # 訪問 /break.html 的時(shí)候纷跛,頁面內(nèi)容重寫到 /index.html 中,并停止后續(xù)的匹配
    rewrite /break.html /index.html break;
    # 訪問 /redirect.html 的時(shí)候邀杏,頁面直接302定向到 /index.html中
    rewrite /redirect.html /index.html redirect;
    # 訪問 /permanent.html 的時(shí)候,頁面直接301定向到 /index.html中
    rewrite /permanent.html /index.html permanent;
    # 把 /html/*.html => /post/*.html 唬血,301定向
    rewrite ^/html/(.+?).html$ /post/$1.html permanent;
    # 把 /search/key => /search.html?keyword=key
    rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;
}

Rewrite VS location
??rewrite 是在同一域名內(nèi)更改獲取資源的路徑
??location 結(jié)合 proxy_pass實(shí)現(xiàn)反向代理望蜡,不會(huì)對(duì)請求的資源路徑進(jìn)行變動(dòng)
?? location 結(jié)合 rewrite 對(duì)某個(gè)具體的請求進(jìn)行重寫
??這三種狀況雖然能實(shí)現(xiàn)大致同樣的效果,但是有一個(gè)優(yōu)先級(jí)保證了他們的基本使用標(biāo)準(zhǔn):
????1. 執(zhí)行server塊的rewrite指令
????2. 執(zhí)行l(wèi)ocation匹配
????3. 執(zhí)行選定的location中的rewrite指令


rewrite規(guī)則.png

Rewrite簡單實(shí)踐(1)
配置文件

~# vim /etc/nginx/conf.d/rewrite.conf
server {
  listen 80;
  server_name rewrite.com;
  rewrite ^/(.*) http://www.rew.com/$1;
}

server {
  listen 80;
  server_name www.rew.com;
  location / {
    root /var/www/html/rew/;
    index index.html index.htm;
  }
}

準(zhǔn)備后端服務(wù)文件

mkdir -p /var/www/html/rew/
echo '<h1>Rewrite</h1>' > /var/www/html/rew/index.html

# vim /etc/hosts
192.168.8.14 rewrite.com www.rew.com

檢查nginx配置后重載服務(wù)

/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx

查看效果

瀏覽器檢查
curl -I rewrite.com

Rewrite簡單實(shí)踐(2)
配置文件

~# vim /etc/nginx/conf.d/last_break.conf
server {
    listen 80;
    server_name localhost;
    location / {
        rewrite /last/ /ok.html last;
        rewrite /break/ /ok.html break;
    }
    location = /ok.html {
        return 400;
    }
}

準(zhǔn)備后端服務(wù)文件

echo '<h1>break_OK</h1>' > /var/www/html/ok.html
檢查nginx配置后重載服務(wù)
/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx

查看效果

瀏覽器檢查
curl localhost/break/
curl localhost/last/

if 指令簡介
??if指令主要是基于nginx的內(nèi)置變量值來獲取請求的關(guān)鍵字拷恨,從而進(jìn)行精確的分發(fā)功能脖律。
if語法

if(內(nèi)置變量 操作符 值){ ... }

??對(duì)給定的條件(內(nèi)置變量 操作符 值)進(jìn)行判斷。如果為真腕侄,大括號(hào)內(nèi)的rewrite指令將被執(zhí)行小泉。
??if條件(conditon)可以是如下任何內(nèi)容:
?? 內(nèi)置變量主要來自于nginx內(nèi)部芦疏,可以參考2.2.3部分。
??操作符主要有三類:
????精確匹配: =微姊、!=
????正則匹配:酸茴、*、!~
????文件匹配:
?????? -f兢交、!-f 判斷是否存在普通文件
??????-d薪捍、!-d 判斷是否存在目錄文件
??????-e、!-e 判斷是否存在文件或目錄
??????-x配喳、!-x 判斷文件是否可執(zhí)行

if指令示例
??如果提交方法為POST酪穿,則返回狀態(tài)405(Method not allowed)。return不能返回301,302

if ($request_method = POST) {
    return 405;
}

??如果請求的文件名不存在晴裹,則反向代理到localhost 被济。這里的break也是停止rewrite檢查

if (!-f $request_filename){
    break;
    proxy_pass  http://127.0.0.1;
}

??如果host不是www.nihao.com,則重定向到標(biāo)準(zhǔn)的www.nihao.com

server {
  listen 80;
  server_name nihao.com www.nihao.com;

  if ( $host != "www.nihao.com" ){
      rewrite ^/(.*)$ http://www.nihao.com/$1 permanent;
  }
  location / {
    try_files $uri $uri/ =404;
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涧团,一起剝皮案震驚了整個(gè)濱河市只磷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌少欺,老刑警劉巖喳瓣,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赞别,居然都是意外死亡畏陕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門仿滔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惠毁,“玉大人,你說我怎么就攤上這事崎页【洗拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵飒焦,是天一觀的道長蜈膨。 經(jīng)常有香客問我,道長牺荠,這世上最難降的妖魔是什么翁巍? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮休雌,結(jié)果婚禮上灶壶,老公的妹妹穿的比我還像新娘。我一直安慰自己杈曲,他們只是感情好驰凛,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布胸懈。 她就那樣靜靜地躺著,像睡著了一般恰响。 火紅的嫁衣襯著肌膚如雪趣钱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天渔隶,我揣著相機(jī)與錄音羔挡,去河邊找鬼。 笑死间唉,一個(gè)胖子當(dāng)著我的面吹牛绞灼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呈野,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼低矮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了被冒?” 一聲冷哼從身側(cè)響起军掂,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昨悼,沒想到半個(gè)月后蝗锥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡率触,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年终议,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葱蝗。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡穴张,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出两曼,到底是詐尸還是另有隱情皂甘,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布悼凑,位于F島的核電站偿枕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏户辫。R本人自食惡果不足惜益老,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寸莫。 院中可真熱鬧,春花似錦档冬、人聲如沸膘茎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽披坏。三九已至态坦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棒拂,已是汗流浹背伞梯。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帚屉,地道東北人谜诫。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像攻旦,于是被迫代替她去往敵國和親喻旷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 大多數(shù) Nginx 新手都會(huì)頻繁遇到這樣一個(gè)困惑牢屋,那就是當(dāng)同一個(gè)location配置塊使用了多個(gè) Nginx 模塊...
    SkTj閱讀 7,584評(píng)論 0 12
  • Nginx簡介 解決基于進(jìn)程模型產(chǎn)生的C10K問題,請求時(shí)即使無狀態(tài)連接如web服務(wù)都無法達(dá)到并發(fā)響應(yīng)量級(jí)一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 1,988評(píng)論 0 9
  • I/O模型Nginx介紹Nginx的安裝和目錄結(jié)構(gòu)Nginx的配置Nginx的編譯安裝 一且预、I/O模型 (一)I/...
    哈嘍別樣閱讀 889評(píng)論 0 4
  • 1.簡介: ? Nginx:engine X ,2002年烙无,開源锋谐,商業(yè)版? http協(xié)議:web服務(wù)器(類似于ht...
    尛尛大尹閱讀 1,860評(píng)論 0 3
  • Nginx入門 本文目的是學(xué)習(xí)Nginx+Lua開發(fā),對(duì)于Nginx基本知識(shí)可以參考如下文章: nginx啟動(dòng)截酷、關(guān)...
    小梅飄雪閱讀 4,317評(píng)論 0 6