首頁 > 軟體

Nginx的一些常用設定彙總

2022-05-13 21:51:00

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;

10、keepalive_timeout設定使用者端與伺服器端請求的超時時間,保證使用者端多次請求的時候不會重複建立新的連線,節約資源損耗。

#keepalive_timeout  0;
keepalive_timeout  65;

11、gzip 啟用壓縮,html/js/css壓縮後傳輸會更快

#gzip on;

12、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`

2、為 cut_my_log.sh 新增可執行的許可權∶

chmod +x cut_my_log.sh

測試紀錄檔切割後的結果∶

./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-590-231-311-121-72020/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 http://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 http://tomcats;
		proxy_http_version 1.1;
		proxy_set_header Connection "";
	}
}

Nginx的快取

瀏覽器快取:加速使用者存取,提升單個使用者(瀏覽器存取者)體驗,快取在本地

Nginx快取:

  • 快取在nginx端,提升所有存取到nginx這一端的使用者
  • 提升存取上游(upstream)伺服器的速度
  • 使用者存取仍然會產生請求流量

控制瀏覽器快取

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 http://tomcats;
	# 啟用快取,和keyS_zone一致
	proxy_cache mycache;
	# 針對200和304狀態碼快取時間為8小時
	proxy_cache_valid 200 304 8h;

使用Nginx設定HTTPS域名證書

安裝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

設定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 http://tomcats/;
		index index.html index.htm;
	}
}

3、reload nginx:./nginx -s reload

附:騰訊雲Nginx設定https檔案地址

總結

到此這篇關於Nginx的一些常用設定彙總的文章就介紹到這了,更多相關Nginx常用設定內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com