百度、京東、網易、騰訊、淘寶等大廠都在用的Web服務器Nginx詳解

Nginx背景和概述

Nginx(發音同 engine x)是一款基於異步框架的輕量級/高性能由C語言的Web 服務器/反向代理服務器/緩存服務器/電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev(伊戈爾·賽索耶夫)所開發,最初供俄國大型網站Rambler.ru及搜尋引擎Rambler使用。

同Apache 一樣都是一種WEB 服務器,基於REST 架構風格,以統一資源描述符(Inform Resources ldentifier )URI 或者統一資源定位符(Uniform Resources Locator )URL 作為溝通依據,通HTTP 協議提供各種網絡服務。Apache 的發展時期很長。而目是毫無爭議的世界第一大服務器,它有著很多優點:穩定、開源、跨平臺等等,它出現的時間太長了,它興起的年代,互聯網產業遠近比不上現在。所以它被設計為一個重量級的它不支持高併發的服務器,在Apache 上運行數以萬計的井發訪問,會導致服務器消耗大量內存,操作系統其進行進程或線程間的切換也消耗了大量的CPU 圖源,導致HTTP 請求的平均響應速度降低。這些都決定了Apache 不可能成為高性能WEB 服務器,輕量圾高井發服務器Nginx 就應運而生了。

Nginx特點

優點

  • 高併發量:基於 epoll/kqueue 模型開發,支持高併發量,官方說其支持高達 5w 併發連接數的響應。
  • 內存消耗少:善於處理靜態文件,相較於其他web(比如:apache),佔用更少的內存及資源。
  • 簡單穩定:配置簡單(一個conf文件),運行簡單(nginx命令),而且運行穩定。
  • 節省寬帶:支持GZIP壓縮,可以添加瀏覽器本地緩存的Hedear頭
  • 內置健康檢查:如果nginx後端有服務區宕機了,不影響前端訪問,能自動監測服務狀態
  • 模塊化程度高:功能模塊插件化設計,可以自由配置相應的功能。
  • 支持Rwrite重寫規則:能夠根據域名、URL等請求關鍵點,實現定製化的高質量分發。
  • 低成本:Nginx的負載均衡功能很強大而且免費開源,相較於幾十萬的硬件負載均衡器成本相當低。
  • 支持多系統:Nginx代碼完全用C語言從頭寫成,可以在各系統上編譯並使用。

缺點

  • 動態處理差:nginx善於處理靜態文件,但是處理動態頁面相較於Apache之類重量級的web軟件能力稍欠缺。
  • rewrite弱:雖然nginx支持rewrite功能多,但是相較於Apache之類重量級的web軟件能力稍欠缺。

Nginx安裝

安裝(Ubuntu為例)

apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-devapt-get install nginx -y

檢查效果

netstat -tnulp | grep nginx

服務相關命令

# 啟動停止systemctl start|stop|reload|... nginx/etc/init.d/nginx start|stop|reload|.../usr/sbin/nginx ... -s stop|reload# 查看信息nginx -Vnginx -v# 檢查配置文件nginx -t                 # 檢查默認配置文件nginx -t -c file.conf    # 指定配置文件進行檢查

移除相關命令

# 查看和nginx相關軟件dpkg --get-selections|grep nginx# 移除nginx,包括相關文件apt-get --purge remove nginxapt-get --purge remove nginx-commonapt-get --purge remove nginx-core

Nginx配置

相關目錄

Windows:

1.conf目錄:存放配置文件的目錄,包含主配置文件nginx.conf,是我們經常修改的配置文件。2.contrib目錄:存放開源愛好者共享的代碼。3.docs目錄:存放文檔資料。4.html目錄:默認存放了Nginx的錯誤頁面和歡迎頁面。5.logs目錄:默認存放了訪問日誌、錯誤日誌和Nginx主進程pid文件。6.temp目錄:臨時目錄,用於存放Nginx運行時產生的臨時文件。7.nginx.exe:可執行程序,常用於Nginx服務的啟動、停止等管理工作。 

linux:

1.*_temp目錄:共有5個temp結尾的目錄,用於存放Nginx運行時產生的臨時文件。2.conf目錄:存放配置文件的目錄,包含主配置文件nginx.conf,是我們經常修改的配置文件。3.html目錄:默認存放了Nginx的錯誤頁面和歡迎頁面等。4.logs目錄:默認存放了訪問日誌和錯誤日誌文件。5.sbin目錄:默認存放了Nginx的二進制命令,常用於Nginx服務的啟動、停止等管理工作。

配置文件

默認文件:/etc/nginx/nginx.conf其他目錄:/etc/nginx/{sites-enabled/conf.d}文件結構:    全局配置段    http配置段        server配置段             # 項目或者應用            location配置段    # url配置

nginx配置詳解

  • 全局配置段

主要是全局性的和服務級別的屬性配置,常見的主要有以下幾種設置:

user                         # 設置使用用戶(worker)worker_processes   # 進行增大併發連接數的處理 跟cpu保持一致 八核設置八個pid                          # nginx服務啟動時候pidevents                                # 定義事件相關的屬性    worker_connections      # 一個進程允許處理的最大連接數    use                                # 定義使用的內核模型 
  • http配置段

主要配置server通用的一些配置:

include mime.types;                       # 文件擴展名與文件類型映射表default_type application/octet-stream;    # 默認文件類型sendfile on;                              # 開啟高效文件傳輸模式。autoindex on;                             # 開啟目錄列表訪問,合適下載服務器,默認關閉。tcp_nopush on;                            # 防止網絡阻塞tcp_nodelay on;                           # 防止網絡阻塞keepalive_timeout 120;                    # 長連接超時時間,單位是秒gzip on;                                  # 開啟gzip壓縮輸出
  • server配置段

常見樣式:

server {    listen :;    server_name ;    ...}

1.listen屬性:

作用:定義server監聽的ip和port,當ip和port匹配時候才進行下一步匹配。

百度、京東、網易、騰訊、淘寶等大廠都在用的Web服務器Nginx詳解

2.server_name屬性:

作用:定義server監聽的域名,當域名匹配時候才進行下一步操作。

百度、京東、網易、騰訊、淘寶等大廠都在用的Web服務器Nginx詳解

3.root屬性:

作用:定義客戶端請求的html文件所在目錄路徑。表現形式:root /var/www/html;

4.index屬性

作用:定義客戶端請求時默認返回的文件。表現形式:index index.html index.htm index.nginx-debian.html;

  • location配置段

location主要是根據server匹配到的請求路徑去處理和響應。 根據請求完整url,獲取uri(即:除了域名(IP)、Port和路徑參數之外的部分),用於location匹配。

匹配規則:

百度、京東、網易、騰訊、淘寶等大廠都在用的Web服務器Nginx詳解

匹配優先級:精確匹配>location 完整路徑>優先匹配>正則匹配>location 部分路徑>通用匹配

匹配示例:

location = / {                 location ~ \\.(gif|jpg|png|js|css)$ {         #精確規則A                       #正則規則D}                              }location = /login {            location ~* \\.png$ {   #精確規則B                       #正則規則E}                              }location ^~ /static/ {         location / {   #優先規則C                       #通用規則F}                              }

location核心動作:響應時按順序查找file,找到則返回file內容,否則的話進行內部重定向(uri)或返回狀態碼(code)。

常見示例:

# 如果能找到指定的uri那麼就返回相應的內容,否則的話返回錯誤狀態碼404location / {    try_files $uri $uri/ =404;}# 如果能找到指定的文件1/2.html那麼就返回相應的內容,否則的話返回6.html文件內容location / {    try_files 1.html 2.html /6.html;}# 如果能找到指定的uri那麼就返回相應的內容,否則的話就內部重定向到後端名稱為@backup的locationlocation / {    try_files $uri @backup;}location @backup {    # ...do something}

location常見操作:

1)基本屬性

location / {    # 指定響應請求的文件所在路徑    root /var/www/html;    # 指定響應請求的默認文件名稱    index index.php index.html index.htm;    # 指定響應請求的文件瀏覽器緩存過期時間,一般用於靜態文件    expires 7d;            # 如果root指定的路徑下有查找的文件,就返回,否則報404                        try_files $uri $uri/ =404;                } 

2)臨時跳轉

location = /test/ {    return 302 http://www.itcast.cn/;}

3)目錄列表

location /upload {    # 指定查看文件列表路徑(絕對路徑)    alias /var/www/upload/;    # 開啟目錄自動索引    autoindex on;       # 默認on,顯示文件確切大小(bytes)。off表示顯示文件的大概大小(kB/MB/...)                      autoindex_exact_size off;    # 默認off,顯示的文件時間為GMT時間。on表示顯示文件的服務器時間    autoindex_localtime on;  }
  • 其他說明

1)root VS alias

root 和 alias 所起的作用都是指定響應請求文件所在的路徑,只是它們有區別。

root 表示 location 匹配內容的相對路徑alias 表示 一個絕對路徑。

一般情況下,在location /中配置root,在location /other中配置alias。

效果一:                                         效果二:location /txt/ {                               location /txt/ {    alias /var/www/txt/;                            root /var/www/txt/;}                                              }

效果一:訪問http://localhost/txt/1.txt,nginx找/var/www/txt/1.txt文件效果二:訪問http://localhost/txt/1.txt,nginx找/var/www/txt/txt/1.txt文件

2)關於URL尾部的/有如下注意事項

* location中的location_match字符有無"/"不受影響,/user/等同/user。* 對於訪問網站域名(http://www.smartli.cn/),尾部有無"/"不受影響,因為瀏覽器會自動補全"/"。* 對於訪問網站域名後面的路徑(http://www.smartli.cn/other/),尾部的"/"很重要。

訪問URL尾部的"/"表示目錄,沒有"/"表示文件,而且文件找不到的話,會發生重定向。

* /other/:表示服務器會自動去該目錄下找對應的默認文件。* /other:表示服務器會先去找other文件,找不到的話會將other當成目錄,重定向到/other/,去該目錄下找默認文件。

Nginx反向代理

代理是什麼?

簡單來說,我找一箇中間人,代替我去做一件事情,只要他給我結果就可以。代理一般分為兩種:正向代理反向代理

百度、京東、網易、騰訊、淘寶等大廠都在用的Web服務器Nginx詳解

區別:

1)從用途上來講

  • 正向代理-為局域網客戶端向外訪問Internet服務,可以使用緩衝特性減少網絡使用率。
  • 反向代理-為局域網服務器向外提供Internet服務,可以使用負載平衡提高客戶訪問量,還可以基於高級URL策略和管理技術對服務進行高質量管控。

2)從安全性來講

  • 正向代理-必須採取安全措施確保內網客戶端通過它訪問外部網站,隱藏客戶端的身份。
  • 反向代理-對外提供服務是透明的,客戶端並不知道自己訪問的是一個代理,隱藏服務端的身份。

nginx代理配置說明

示例:

location / {    # 設定請求跳轉後的地址,可以使用hostname或ip:port形式    proxy_pass        http://localhost:8000;  } 

proxy_pass指令設置被代理服務器的地址和被映射的URI,地址可以使用主機名或IP加端口號的形式。

Nginx負載均衡

上一小節我們使用proxy_pass的方式實現了nginx代理請求到後端服務器的效果,隨著我們的網站訪問量越來越多,一個後端服務器就不現實了,那麼接下來如何在訪問量日漸增大的情況下,滿足線上業務的穩定呢?解決方法就是:負載均衡

基本配置

示例:

upstream backends {  server [域名|ip]:port;  server [域名|ip]:port;  server [域名|ip]:port;  ...}server {  location / {    proxy_pass http://backends;  }}

負載均衡策略

Nginx提供的負載均衡策略有兩種:

內置策略:nginx自帶的算法

  • 雨露均霑型:輪訓、加權輪訓、哈希
  • 定向服務型:ip_hash、least_conn、cookie、route、lean
  • 商業類型:ntlm、least_time、queue、stick

擴展策略:各種結合業務場景自定義的算法或者第三方算法

  • 自定義算法
  • 第三方算法:fair、url_hash

常用算法簡介

  • 輪詢(默認):請求按順序逐一分配到不同的後端服務器。
  • weight:指定輪詢權重,值越大,分配到的幾率就越高,適用於後端服務器性能不均衡情況。
  • ip_hash:按訪問IP的哈希結果分配請求,分配後客戶端訪問固定後端服務器,有效的解決動態網頁會話共享問題。
  • fair:基於後端服務器的響應時間來分配請求,響應時間短的優先分配。
  • url_hash:按訪問URL的哈希結果分配請求,使同一URL定向到同一臺後端服務器,可提高後端緩存服務器的效率。

加權輪訓示例:

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

ip_hash示例:

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

日誌解析

通過對日誌文件的分析,可以為網站運營和維護提供相應的數據支持,最常見的場景就是獲取客戶端的IP,記錄用戶訪問量。

Nginx默認提供了兩個日誌文件 access.log和error.log。

  • access.log:可以得到用戶請求的相關信息;
  • error.log:可以獲取某個web服務故障或其性能瓶頸等信息。

1)基本配置

# cat /etc/nginx/nginx.confaccess_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;

2)默認日誌格式

log_format combined '$remote_addr - $remote_user [$time_local] '                    '"$request" $status $body_bytes_sent '                    '"$http_referer" "$http_user_agent"';

自定義日誌

1)設置日誌格式

# vim /etc/nginx/nginx.conf# Logging Settings## 設定日誌格式的方法: log_format 格式名稱 "日誌表現樣式"log_format proxy_format '$remote_addr - $remote_user [$time_local] '              '"$request" $status $body_bytes_sent "$http_referer"'              '"$http_user_agent" "$http_x_forwarded_for"';

2)使用日誌格式

access_log 日誌路徑 格式名稱;

學完以上的配置,你就基本上可以使用Nginx配置一個簡單的比如博客網站,自己買一個服務器然後安裝Nginx配置一下文件,把你的博客文件放到指定目錄下,然後訪問你服務器對應的地址和端口就可以輕鬆的看到你的博客啦,快去嘗試吧!

當然,Nginx用在大廠上面是需要更多的配置的,以滿足高併發下的需求。

作者簡介:Python菜鳥工程師,將在接下來的一段時間內與大家分享一些與Python相關的知識點。如若文中出現問題,各位大佬多多指點,互相學習。喜歡的關注一個吧!謝謝!


分享到:


相關文章: