需要學會的Nginx知識

操作系統:CentOS-7.8
nginx版本:1.18.0

一、概述

1、什麼是Nginx

Nginx 是一個高性能的 WEB 和反向代理服務器,同時也提供了 IMAP/POP3/SMTP(郵件) 服務。Nginx採用C語言編寫,它的作者是伊戈爾·賽索耶夫,第一個公開版本2004年發佈,截至文章編寫時nginx的最新穩定版是1.18.0。

Nginx因爲它的穩定性、豐富的模塊庫、靈活的配置和低系統資源的消耗而聞名,Nginx常被用來做靜態資源管理服務器和反向代理與負載均衡。

2、其他常用的web服務器

  • Apache

Apache是世界上廣泛使用的Web服務器軟件,它可以運行在幾乎所有廣泛使用的計算機平臺上,由於其跨平臺和安全性被廣泛使用,是最流行的Web服務器端軟件之一。19年之前Apache使用佔有率居世界第一,可是隨着Nginx的流行,現在Nginx已經佔據了使用率第一的位置

  • Tomcat

Tomcat 服務器是一個免費的開放源代碼的 Web 應用服務器,屬於輕量級應用服務器,在中小型系統和併發訪問用戶不是很多的場合下被普遍使用,主要用於運行基於 Java 的 Web 應用軟件,Tomcat 也具有處理 HTML 頁面的功能,但是它處理靜態 HTML 的能力不如 Apache 和 Nginx 服務器,所以 Tomcat 經常僅被用來提供API接口服務。

  • Jboss

Jboss 是一個基於J2EE的開放源代碼的應用服務器。 JBoss代碼遵循LGPL許可,可以任何商業應用中免費使用

  • WebLogic

WebLogic是由Oracle出品,是一個用於開發、集成、部署和管理大型分佈式Web應用、網絡應用和數據庫應用的Java應用服務器。WebLogic是一款商業軟件,是面向企業的,需付費使用。

  • IIS

IIS服務器是微軟旗下的WEB服務器,也是目前最流行的Web服務器產品之一。

  • Kangle

Kangle web服務器是一款跨平臺、功能強大、安全穩定、易操作的高性能web服務器和反向代理服務器軟件。

3、正向代理與反向代理

代理

代理是網絡信息的中轉站,是個人網絡和Internet服務商之間的中間機構,負責轉發合法的網絡信息,對轉發進行控制和登記。

如下圖是一個代理與非代理的比較,不存在代理時,用戶直接與提供服務的服務器直接建立連接進行通信,存在代理時,用戶和服務端之間需要經過代理服務器進行數據轉發,並且代理也可以是多級的。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fP2fR3Dv-1592733017191)(http://file.te-amo.site/images/thumbnail/%E9%9C%80%E8%A6%81%E5%AD%A6%E4%BC%9A%E7%9A%84Nginx%E7%9F%A5%E8%AF%86/proxy.png)]

正向代理

正向代理是一個位於客戶端和服務端之間的服務器,客戶端向代理服務器發送一個請求並指定目標服務端,然後代理服務器向指定的服務端轉交請求並將獲得的內容返回給客戶端。

正向代理的過程可以將用戶和代理服務器看爲一體,從用戶角度來看,服務端是可見的,用戶清楚的知道服務端的信息,可以明確指定目標,而在服務端的角度來看,具體用戶是不可見的,服務端可見的是代理服務器,至於代理服務器後面有多少具體用戶,都是不可見的。如下圖所示

正向代理

比如我們在公司內網環境,我們的電腦主機是無法訪問外部服務器,如果此時我們需要訪問外部服務器,這時我們的PC就會向代理服務器發送請求訪問xxx服務器,代理服務器在收到請求後去訪問指定服務器並將獲得的數據再返回給發送請求的PC,這樣就實現了訪問。從例子,我們可以看出,我們的PC是明確知道要訪問的目標,但是由於所有真實的請求都是代理服務器發出的,所以目標服務端只能看到代理服務器信息。

所以正向代理一般用在防火牆內網中提供防火牆外部網絡的訪問服務,一般公司中辦公電腦訪問外部網站都是通過正向代理來實現,這樣可以做到對公司內部信息的監控和保護,內部信息向外泄露。

反向代理

反向代理是一個位於客戶端和服務端之間的服務器,反向代理服務器就相當於目標服務器,用戶不需要知道目標服務器的地址,用戶直接訪問反向代理服務器就可以獲得目標服務器提供的資源。

反向代理的過程是將代理服務器和服務端視爲一體,在用戶角度來看,具體服務端是不可見的,用戶並不知道自己具體是從哪一個具體的服務器獲取的數據,而站在服務端的角度來看,具體用戶是可見的,服務端是知道是哪個用戶發來的請求。如下圖所示

反向代理

比如我們的電腦要去訪問www.baidu.com,當我們去訪問時,我們的請求都是被分配到網站的反向代理服務器,反向代理服務器根據具體配置的規則,再將我們的請求轉發給網站內部的具體服務器,然後再將數據返回給我們。

這樣一個過程就將一個服務集羣對用戶進行了隱藏,用戶只能看到暴露的代理服務器,而內部服務端內部具體的服務器是看不到的,也保證了內部服務器的安全性。反向代理一般被用來作爲Web加速和負載均衡,以提高服務的可用性和訪問效率

一個具體栗子

我們在公司內網中的PC要訪問www.baidu.com。圖示如下

代理栗子

上圖過程可以描述爲:

  • a.用戶PC向正向代理服務器發送請求,表明需要訪問www.baidu.com

  • b.正向代理服務器接收請求後,向www.baidu.com發送請求

  • c.根據DNS解析出的IP指向了baidu的反向代理服務器

  • d.baidu的反向代理服務器收到請求後,根據代理策略,從內部多臺服務器中選擇一臺,向其發送請求

  • e.baidu的反向代理服務器在獲取到請求結果後,就將結果數據返回給發來請求的正向代理服務器

  • f.正向代理服務器在收到數據後,將數據再返回給發來請求的PC

  • g.最後PC收到數據後,這個請求就完成了

4、Nginx特性

高併發

首先nginx整個服務採用了多進程master-worker的設計,nginx 在啓動後,會有一個 master 進程和多個相互獨立的 worker 進程(可配置),master進程接收來自外界的連接,並向各worker進程發送信號,work進程用來處理具體連接。

其次nginx的IO模型是採用基於事件驅動的異步IO模型,且nginx使用的是最新的epoll和kqueue網絡IO模型,
相比於select,epoll最大的好處在於它不會隨着監聽文件句柄數目的增長而降低效率,並且select在內核中也設置了監聽句柄的上限爲1024(可修改,需重新編譯內核),所以使用epoll也是nginx可以支持更多的併發原因

內存消耗少

nginx有設計自己的內存池,使用內存池可以有減少向系統申請和釋放內存的時間開銷,也可以解決內存頻繁分配產生的碎片,並且nginx的內存也有自己特殊的設計幫助其減少內存開銷

簡單穩定

簡單一般是指nginx的配置簡單,其核心配置就一個配置文件,且配置內容沒有非常繁瑣複雜,對於一般的開發和使用者不會造成很大的困難。

穩定是指nginx性能比較穩定,可以長時間不間斷運行,且支持熱加載,修改配置等操作時不用重啓服務

低成本支持多系統

nginx是採用BSD開源協議,允許使用者修改代碼或者發佈自己的版本,所以使用在商業上也可以免費。nginx的代碼是採用C語言編寫,現在也已經移植到許多體系結構和操作系統,可以在不同的操作系統上安裝使用。

二、nginx安裝

參見文章《學習必備——nginx安裝》

三、常用配置

1、常用命令

  • 強制停止nginx:./nginx -s stop

  • 正常關閉nginx,不再接受新連接,等待現有用戶連接處理完成後退出nginx:./nginx -s quit

  • 檢測配置文件的正確性:./nginx -t

  • 查看nginx當前版本:./nginx -v

  • 查看nginx的詳細信息:./nginx -V

  • 指定nginx配置文件:./nginx -c [filename]

  • 重新加載配置文件:./nginx -s reload

2、nginx.conf 配置說明

先看一下nginx.conf 的包含結構如下圖所示:

nginx.conf

如下是一份安裝完成後的默認配置,我將配置的說明也寫在其中


#設置worker進程的所屬用戶,設置不同的用戶由於用戶權限不同所以對worker進程操作文件有影響,默認是nobody用戶,查看nginx進程是用命令:ps -ef | grep nginx 就可以看到進程和所屬用戶
#user  nobody;
#設置worker進程的個數,默認設置爲1個
worker_processes  1;

#錯誤日誌配置,日誌級別包括:debug、info、notice、warn、error、crit、alert、emerg
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#nginx的進程號
#pid        logs/nginx.pid;

#events模塊中包含nginx中所有處理連接的設置
events {
    #選擇nginx連接所使用的IO模型,Linux下建議使用epoll
    use epoll;
    #每個worker允許的最大連接數
    worker_connections  1024;
}

#http相關配置,內部可以嵌套多個server,配置代理,緩存,日誌等絕大多數功能和第三方模塊的配置
http {
    #mime.type是一個文件,裏面定義了可使用的文件類型與文件拓展名的映射
    include       mime.types;
    
    #默認的文件類型
    default_type  application/octet-stream;
    
    #設置一個日誌格式化的格式,名字叫‘main’,裏面包含的參數含義如下:
    #$remote_addr	客戶端ip
    #$remote_user	遠程客戶端用戶名
    #$time_local		時間和時區
    #$request	請求的url以及method
    #$status	響應狀態碼
    #$body_bytes_send		響應客戶端內容字節數
    #$http_referer	記錄用戶從哪個鏈接跳轉過來的
    #$http_user_agent		用戶所使用的代理,一般來時都是瀏覽器
    #$http_x_forwarded_for		通過代理服務器來記錄客戶端的ip
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
    #設置access_log的位置並制定使用main格式進行格式化
    #access_log  logs/access.log  main;

    #允許sendfile方式傳輸文件
    sendfile        on;
    #開源tcp_nopush時,數據包累積到一定大小時再發送,tcp_nopush必須和sendfile配合使用,是提高文件傳輸效率的
    #tcp_nopush     on;

    #連接超時時間,單位是秒,保證客戶端多次請求的時候不會重複建立新的連接,節約資源損耗。設定爲0時,客戶端每次連接都是新建連接
    #keepalive_timeout  0;
    keepalive_timeout  65;
    
    #開啓gzip壓縮,進行數據傳輸時進行壓縮
    #gzip  on;

    #一個虛擬的主機配置
    server {
        #監聽的端口號
        listen       80;
        #監聽的地址,虛擬主機名
        server_name  localhost;
        #字符集
        #charset koi8-r;
        
        #access日誌的配置,當前只是配置當前server的日誌
        #access_log  logs/host.access.log  main;
        
        #路由規則配置8
        location / {
            #當前路由的根目錄
            root   html;
            #默認主頁
            index  index.html index.htm;
        }
        
        #默認404錯誤頁配置
        #error_page  404              /404.html;
        
        #50x錯誤頁配置
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    


    #另一個虛擬主機配置
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    
    #Https的虛擬主機配置
    # HTTPS server
    #
    #server {
    #    監聽端口
    #    listen       443 ssl;
    #    監聽地址
    #    server_name  localhost;
    #
    #    ssl安裝連接相關配置
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

3.location路由匹配規則解析

通用匹配


location / {
    root   html;
}

示例:http://host:port/a/b
在“/"後面值的路由都會被匹配

精確配置


location =/ {
    root   html;
}

示例:http://host:port/
只能配置 ‘/’ 後面如果添加其他路由是無法匹配的

正則匹配


location ~* /ca {
    root   html;
}

location ~ /CA {
    root   html;
}

正則匹配分爲區分大小寫和不區分大小寫兩種。
’ 代表不區分大小寫,去掉‘’則匹配時區分大小寫

示例:

  • “~* /case”可以匹配:http://host:port/ca 、 http://host:port/Ca 、 http://host:port/cA 和http://host:port/CA

  • “~ /CASE”只能匹配:http://host:port/CA

精準前綴匹配


location ^~ /ca {
    root   html;
}

示例:http://host:port/ca/file
只能匹配以ca開頭的下一級,例如“ca/file/a”就是無法匹配

匹配優先級

在多個匹配規則同時存在時,精確匹配優先級最高,其次是精準前綴匹配,然後是區分大小寫的正則匹配,再然後是不區分大小寫的正則匹配,最後是通用匹配。

舉個例子


精確匹配:location =/ca 
精確前綴匹配:location ^~ /ca 
區分大小寫正則匹配:location ~ /ca 
不區分大小寫正則匹配:location ~* /ca 
通用匹配:location /  

請求url:http://host:port/ca

  • 5種規則全存在,則匹配精確匹配

  • 2-5存在,則匹配精確前綴匹配

  • 3-5存在,則匹配區分大小寫的正則匹配

  • 4-5存在,則匹配不區分大小寫正則匹配

  • 僅有5存在,則匹配通用匹配

4.跨域配置與防盜鏈

在server塊的配置中進行配置跨域支持


#允許跨域請求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允許帶上cookie請求
add_header 'Access-Control-Allow-Credentials' 'true';
#允許請求的方法,比如 GET/POST/PUT/DELETE,*代表所有方法
add_header 'Access-Control-Allow-Methods' *;
#允許請求的header,*代表所有的header
add_header 'Access-Control-Allow-Headers' *;
 

防盜鏈配置如下


#對發送請求的域名驗證
valid_referers *.domain.com; 
#驗證不通過則返回404
if ($invalid_referer) {
    return 404;
} 

個人公衆號【愛做夢的錘子】,全網同id,個站 http://te-amo.site,歡迎關注,裏面會分享更多有用知識,還有我的私密照片

覺得不錯就點個贊叭QAQ

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