Nginx的常用配置

Nginx配置文件結構

  1. 設置worker進程的用戶,指的linux中的用戶,會涉及到nginx操作目錄或文件的一些權限,默認為 nobodyuser root;

  2. worker進程工作數設置,一般來說CPU有幾個,就設置幾個,或者設置為N-1也行。worker_processes 1;

  3. nginx日誌級別 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;
    
  4. 設置nginx進程 pid

    pid logs/nginx.pid;

  5. 設置工作模式

    events {
    	# 默認使用epolL 
    	use epoll;
    	# 每個worker允許連接的客戶端最大連接數
    	worker_connections 1024;
    }
    
  6. http 是指令塊,針對http網絡傳輸的一些指令配置

    http {
    }
    
  7. include引入外部配置,提高可讀性,避免單個配置文件過大

    include mime.types;

  8. 設定日誌格式, main 為定義的格式名稱,如此 access_log就可以直接使用這個變量了

    #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  logs/access.log  main;
    
    參數名 參數意義
    $remote_addr 客戶端ip
    $remote_user 遠程客戶端用戶名,一般為:『-』
    $time_local 時間和時區
    $request 請求的url以及method
    $status 響應的狀態碼
    $body_bytes_sent 響應客戶端內容位元組數
    $http_referer 記錄用戶從哪個鏈接跳過來
    $http_user_agent 用戶所使用的代理,一般來時都是瀏覽器
    $http_x_forwarded_for 通過代理服務器來記錄客戶端的ip
  9. sendfile 使用高效文件傳輸,提升傳輸性能。啟用後才能使用 tcp_nopush,是指當數據表累積一定大小後才發送,提高了效率。

sendfile        on;
tcp_nopush     on;
  1. keepalive_timeout設置客戶端與服務端請求的超時時間,保證客戶端多次請求的時候不會重複建立新的連接,節約資源損耗。

    #keepalive_timeout  0;
    keepalive_timeout  65;
    
  2. gzip 啟用壓縮,html/js/css壓縮後傳輸會更快

    #gzip on;

  3. server 可以在 http指令塊中設置多個虛擬主機

    • listen 監聽端口
    • server_name localhost、ip、域名
    • location請求路由映射,匹配攔截
    • root 請求位置
    • index 首頁設置
server {
    listen       80;
    server_name  localhost;

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

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

}

Nginx日誌切割

手動切割

現有的日誌都會存在 access.log 文件中,但是隨着時間的推移,這個文件的內容會越來越多,體積會越來越大,不便於運維人員,查看,所以我們可以通過把這個大的日誌文件切割為多份不同的小文件作為日誌,切割規則可以以天 為單位,如果每天有幾百G或者幾個T的日誌的話,則可以按需以每半天 或者 每小時 對日誌切割一下。

具體步驟如下∶

  1. 到nginx的sbin目錄,創建一個shell可執行文件∶ cut_my_log.sh,內容為∶
#!/bin/ bash
L0G_PATH="/var/log/nginx"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
#向Nginx主進程發送信號,用於重新打開日誌文件
kill -USR1 `cat $PID`
  1. cut_my_log.sh 添加可執行的權限∶

    chmod +x cut_my_log.sh

  2. 測試日誌切割後的結果∶

    ./cut_my_Log.sh

定時切割:使用定時任務

  1. 安裝定時任務∶

    yum install crontabs

  2. crontab -e 編輯並且添加一行新的任務∶

    */1 * * * * /usr/local/nginx/sbin/cut_my_log.sh

  3. 重啟定時任務∶

    service crond restart

● 附∶常用定時任務命令∶

service crond start			//啟動服務
service crond stop			//關閉服務
service crond restart		//重啟服務
service crond reload		//重新載入配置
crontab -e					//編輯任務
crontab -l					//查看任務列表

定時任務表達式∶

Cron表達式分為5或6個域,每個域代表一個含義,如下所示∶

取值範圍 星期幾 年(可選)
取值範圍 0-59 0-23 1-31 1-12 1-7 2020/2021/2022/…

常用表達式

  • 每分鐘執行∶*/1 * * * *
  • 每日凌晨(每天晚上23∶59)執行∶59 23 * * *
  • 每日凌晨1點執行∶0 1 * * *

root 與 alias

假如服務器路徑為∶/home/imooc/files/img/face.png

  • root 路徑完全匹配訪問

    配置的時候為∶

    location /imooc {
        root /home
    }
    

    用戶訪問的時候請求為∶url:port/imooc/files/img/face.png

  • alias 可以為你的路徑做一個別名,對用戶透明

配置的時候為∶

location /hello {
    alias /home/imooc
}

用戶訪問的時候請求為∶url:port/hello/files/img/face.png,如此相當於為目錄 imooc做一個自定義的別名。

使用GZIP壓縮提升請求效率

# 開啟gzip壓縮功能,目的∶提高傳輸效率,節約帶寬
gzip on;
# 限制最小壓縮,小於1位元組文件不會壓縮
gzip_min_length 1;
# 定義壓縮的級別(壓縮比,文件越大,壓縮越多,但是cpu使用會越多)
gzip_comp_level 3;
# 定義壓縮文件的類型
gzip_types text/plain application/javascript application/x-javascript text/css applicatio n/xmL text/javascript application/x-httpd-php image/jpeg image/gif image/png application/jison;

location匹配規則解析

  • 空格∶默認匹配,普通匹配

    location / {
    	root /home
    }
    
  • =∶精確匹配。

    location = /imooc/img/face1.png {
    	root /home;
    }
    
  • ~*∶匹配正則表達式,不區分大小寫

    # 符合圖片的顯示
    location ~* \.(GIF|jpg|png|jpeg){
    	root /home;
    }
    
  • ~∶匹配正則表達式,區分大小寫

    # GIF必須大寫才能匹配到
    location ~ \.(GIF|jpg|png|jpeg){
    	root /home;
    }
    
  • ^~∶以某個字符路徑開頭

    location ^~ /imooc/img {
    	root /home;
    }
    

使用SwitchHosts模擬本地域名解析

下載SwitchHosts工具添加配置:192.168.170.129 www.baidu.com,或者找到本機的hosts文件,添加這行配置,本地域名就模擬好了,如下:

Nginx跨域配置支持

#允許跨域請求的域,*代表所有 
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 
add_header 'Access-Control-Allow-Headers' *;

Nginx防盜鏈支持

為了 保證自己網站的靜態資源不能被其它網站引用,我們可以在nginx中做如下配置:

#對源站點驗證 
valid_referers *.imooc.com; 
#非法引入會進入下方判斷 
if ($invalid_referer) { 
	return 404; 
}

Nginx負載均衡

OSI 網絡模型

在講到Nginx負載均衡的時候,其實Nginx是七層負載均衡,後續我們還會涉及到LVS,是四層負載均衡,七層和四層是什麼概念呢?這就必須提到網絡模型。網絡模型是計算機網絡基礎的一部分內容,一般大學計算機系都會講到此知識點,並且會作為考點;其實在面試過程中有時候也會被問到。所以我們還是有必要來複習或學習一下這塊的一些重要知識的。

網絡模型就是 OSI(0pen System Interconnect),意思為 開放網絡互聯 ,是由國際標準化組織(ISO)和國際電報電話諮詢委員會(CCITT)共同出版的,他是一種網絡互聯模型,也是一種規範。

網絡模型分為七層,也就是當用戶發起請求到服務器接收,會歷經七道工序,或者說用戶利用互聯網發送消息給另一個用戶,也會歷經七道工序。這七層可以分為如下∶

層級 名稱 說明
第七層 應用層 與用戶行為交互
第六層 表示層 定義數據格式以及數據加密
第五層 會話層 創建、管理以及銷毀會話
第四層 傳輸層 創建、管理請求端到響應端(端到端)的連接
第三層 網絡層 請求端的IP地址
第二層 數據鏈路層 提供介質訪問與鏈路管理
第一層 物理層 傳輸介質,物理媒介

以上七層每層可以與上下相鄰層進行通信。每一層都是非常複雜的,我們不在這裡深究,我們以舉例的形式來闡述每一層是幹嘛的。

  • 應用層: 這是面向用戶的,最靠近用戶,為了讓用戶和計算機交互,在計算機里會有很多軟件,比如eclipse,idea,qq,微信,淘寶等,這些都是應用軟件,用戶可以通過這些應用軟件和計算機交互,交互的過程其實就是接口的調用,應用層為用戶提供了交互的接口,以此為用戶提供交互服務。那麼在這一層最常見的協議有∶HTTP,HTTPS,FTP,SMTP,POP3等。Nginx在本層,為七層負載均衡。

    舉例∶我要寄一封信給遠在天邊的老外LiLei,我會打開快遞軟件下單,這個時候我是 用戶,快遞軟件就是 應用服務,是建立在計算機上的,提供給用戶交互的一種服務或稱之為手段。

  • 表示層: 該層提供數據格式編碼以及加密功能,確保 請求端 的數據能被 響應端 的應用層識別。

    舉例∶我寫中文給LiLei,他看不懂,這個時候我就會使用翻譯軟件把中文翻譯成英文,隨後信中涉及到一些比較隱私的信息我會加密一下,這個時候翻譯軟件和加密器就充當了 表示層 的作用,他用於顯示用戶能夠識別的內容。

  • 會話層: 會話可以理解為session,請求發送到接受響應的這個過程之間存在會話,會話層就充當了這一過程的管理者,從創建會話到維護會話最後銷毀會話。

    舉例∶我每次寫信給LiLei都會記錄在一個小本本上,寄信時間日期,收信時間日期,這本小本本上存有每次通信記錄,這個小本本就相當於是一個會話的管理者。又或者說,我們平時在打電話,首先需要撥打電話,這是 建立會話 ,對方接聽電話,此時正在通話(維持並管理會話),通話結束後會話銷毀 ,那麼這也是一次會話的生命周期。

  • 傳輸層: 該層建立端到端的連接,他提供了數據傳輸服務,在傳輸層通信會涉及到端口號,本層常見的協議為TCP、UDP,LVS就是在傳輸層,也就是四層負載均衡。

    舉例∶我和LiLei通信過程中會藉助快遞公司,快遞公司會分配快遞員取件和寄件,那麼這個快遞員則充當 傳輸層 的齋田。

  • 網絡層: 網絡通信的時候必須要有本機IP和對方的IP,請求端和響應端都會有自己的IP的,IP就相當於你家地址門牌號,在網絡上雲服務器有固定的公網IP,普通計算機也有,只不過是動態IP,運營商每天會分配不同的IP給你的計算機。所以網絡層也能稱之為IP層,IP是互聯網的基礎根本。能提供IP分配的設備則為路由器或交換機。

    舉例∶對於擁有固定IP的雲服務來說,他們都是由騰訊雲、阿里雲等這樣的供應商提供的,他們為雲服務器提供固定ip ;電信、移動、聯調等運營商為你的計算機動態分配ip,每天都不同;則這些供應商和運營商都是網絡層。同理,快遞員由物流公司分配和管理,那麼物流公司就是 網絡層 咯。

  • 數據鏈路層: 這一層會提供計算機MAC地址,通信的時候會攜帶,為了確保請求投遞正確,所以他會驗證檢測MAC 地址,以確保請求響應的可靠性。

    舉例∶快遞員在投遞派送的時候,他(或客服)會預先提前打電話給你,確認你家地址對不對、有沒有人、貨到付款有沒有準備好錢等等,這個時候快遞員(或客服)就充當了數據鏈路層 的職責。

  • 物理層∶ 端到端請求響應過程中的媒介,物理介質,比如網線、中繼器等等設備,都是你在端到端交互過程中不可缺少的基礎設備。

    舉例∶快遞員在投遞的過程中,你寫的信會歷經一些交通運輸工具,比如首先通過飛機運輸到國外,在海關統一拿到信以後會通過汽車運輸到LiLei所在城市的物流集散地,最後快遞員通過三輪電頻車寄到LiLei家裡,這個時候,飛機、汽車、三輪電瓶車都是 物理層 的媒介。

負載均衡策略:

  • 輪詢:輪詢是Nginx負載均衡的默認策略。使用場景:針對每個服務器硬件配置一樣。

  • 加權輪詢(weight):根據設置的權重值去分配處理請求的數量。使用場景:服務器硬件配置有差異,讓好的服務器去處理更多的請求。

  • ip_hash:對請求用戶的IP地址進行hash運算後得到的值,再對服務器數量進行取模運算。讓同一用戶的請求落到固定的服務器上。這樣就可以保證用戶訪問可以請求到上游服務中的固定的服務器,前提是用戶ip沒有發生更改。使用ip hash的注意點∶不能把後台服務器直接移除,只能標記 down .

    upstream tomcats {
    	ip_hash;
    
    	server 192.168.1.173:8080;
    	server 192.168.1.174:8080 down;
    	server 192.168.1.175:8080;
    }
    
  • 一致性哈希算法:讓每台服務器IP的hash值落在哈希環節點上,在用戶請求到Nginx時,根據順時針就近原則落到最近的服務器節點。

  • url_hash:根據每次請求的url地址,hash後訪問到固定的服務器節點。

    upstream tomcats {
    	# url  hash
    	hash $request_uri;
    	# 最少連接數
    	# least_Conn
    	server 192.168.1.173:8080;
    	server 192.168.1.174:8080;
    	server 192.168.1.175:8080;
    }
    
    server {
    	listen 80;
    	server_name www.tomcats.Com;
    	
    	location / {
    		proxy_pass //tomcats;
    	}
    }
    

upstream指令參數

  • max_conns:限制每台server的連接數,用於保護避免過載,可起到限流作用。測試參考配置如下∶

    # worker進程設置1個,便於測試觀察成功的連接數
    worker_processes 1;
    
    upstream tomcats {
    	server 192.168.1.173:8080 max_conns=2;
    	server 192.168.1.174:8080 max_conns=2;
    	server 192.168.1.175:8080 max_conns=2;
    }
    
  • slow_start:商業版,需要付費。配置參考如下:

    upstream tomcats {
    	server 192.168.1.173:8080 weight=6 slow_start=60
    	server 192.168.1.174:8080 weight=2;
    	server 192.168.1.175:8080 weight=2;
    }
    
    • 該參數不能使用在 hash 和 random Load balancing 中。
    • 如果在 upstream 中只有一台server,則該參數失效。
  • down、backup

    • down 用於標記服務節點不可用∶

      upstream tomcats {
      	server 192.168.1.173:8080 down;
      	server 192.168.1.174:8080 weight=1;
      	server 192.168.1.175:8080 weight=1;
      }
      
    • 表示當前服務器節點是備用機,只有在其他的服務器都宕機以後,自己才會加入到集群中,被用戶訪問到

      upstream tomcats {
      	server 192.168.1.173:8080 backup;
      	server 192.168.1.174:8080 weight=1;
      	server 192.168.1.175:8080 weight=1;
      }
      

      注意:backup參數不能使用在 hash 和 random Load balancing 中。

  • max_fails、fail_timeout

    • max_fails∶表示失敗幾次,則標記server已宕機,剔出上游服務。

    • fail_timeout∶表示失敗的重試時間。假設目前設置如下∶

      max_fails=2 fail_timeout=15s
      

      則代表在15秒內請求某一server失敗達到2次後,則認為該server已經掛了或者宕機了,隨後再過15秒,這15秒內不會有新的請求到達剛剛掛掉的節點上,而是會請求到正常運作的server,15秒後會再有新請求嘗試連接掛掉的server,如果還是失敗,重複上一過程,直到恢復。

Keepalived 提高吞吐量

keepalived ∶ 設置長連接處理的數量

proxy_http_version ∶設置長連接http版本為1.1

proxy_set_header ∶清除connection header信息

upstream tomcats {
	#server 192.168.1.173:8080 max_fails=2 failtimeout=1s;
	server 192.168.1.190:8080;
	#server 192.168.1.174:8080 weight=1;
	server 192.168.1.175:8080 weight=1;keepalive 32
}

server {
	listen 80;
	server_name: www.tomcats.com;

	location / {
		proxy_pass //tomcats;
		proxy_http_version 1.1;
		proxy_set_header Connection "";
	}
}

Nginx的緩存

  1. 瀏覽器緩存:加速用戶訪問,提升單個用戶(瀏覽器訪問者)體驗,緩存在本地

  2. Nginx緩存:

    • 緩存在nginx端,提升所有訪問到nginx這一端的用戶
    • 提升訪問上游(upstream)服務器的速度
    • 用戶訪問仍然會產生請求流量
  3. 控制瀏覽器緩存

    location /files {
    	alias /home/imooc;
    	# expires 10s;
    	# expires @22h30m;
    	# expires -1h;
    	# expires epoch;
    	# expires off;
    	expires max;
    }
    

Nginx的反向代理緩存

# proxy_cache_path 設置緩存目錄#
# keys_zone 設置共享內存以及佔用空間大小
# max_size 設置緩存大小
# inactive 超過此時間則被清理
# use_temp_path 臨時目錄,使用後會影響nginx性能
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=1m use_temp_path=off;
location / {
	proxy_pass //tomcats;
	# 啟用緩存,和keyS_zone一致
	proxy_cache mycache;
	# 針對200和304狀態碼緩存時間為8小時
	proxy_cache_valid 200 304 8h;

使用Nginx配置HTTPS域名證書

  1. 安裝SSL模塊:要在nginx中配置https,就必須安裝ssl模塊,也就是∶http_ssl_module

    1. 進入到nginx的解壓目錄∶ /home/software/nginx-1.16.1

    2. 新增ssl模塊(原來的那些模塊需要保留)

      ./configure \
      --prefix=/usr/local/nginx \
      --pid-path=/var/run/nginx/nginx.pid \
      --lock-path=/var/lock/nginx.lock \
      --error-log-path=/var/Log/nginx/error.log \
      --http-log-path=/var/log/nginx/access.log \
      --with-http_gzip_static_module \
      --http-client-body-temp-path=/var/temp/nginx/client \
      --http-proxy-temp-path=/var/temp/nginx/proxy \
      --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
      --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
      --http-scgi-temp-path=/var/temp/nginx/scgi \
      --with-http_ssl_module
      
    3. 編譯和安裝

      make
      make install
      
  2. 配置HTTPS

    1. 把ssl證書 *.crt 和私鑰*.key拷貝到/usr/local/nginx/conf 目錄中。

    2. 新增 server 監聽 443端口∶

      server {
      	listen 443;
      	server_name www.imoocdsp.com;
      
      	# 開啟ssl
      	ssl on;
      	# 配置ssl證書
      	ssl_certificate	1_www.imoocdsp.com_bundle
      	# 配置證書秘鑰
      	ssl_certificate_key 2_www.imoocdsp.com.key;
      	
      	# ssl會話
      	ssl_session_cache shared:SSL:1m
      	# ssl會話超時時間
      	ssl_session_timeout 5m;
      
      	# 配置加密套件,寫法遵循 openssl 標準
      	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!
      	ssl_prefer_server_ciphers on;
      
      	location / {
      		proxy_pass //tomcats/;
      		index index.html index.htm;
      	}
      }
      
  3. reload nginx:./nginx -s reload

附:騰訊雲Nginx配置https文檔地址

Tags:
Exit mobile version