Nginx的一些常用配置匯總
Nginx配置文件結(jié)構(gòu)
1、設(shè)置worker進程的用戶,指的linux中的用戶,會涉及到nginx操作目錄或文件的一些權(quán)限,默認為 nobodyuser root;
2、worker進程工作數(shù)設(shè)置,一般來說CPU有幾個,就設(shè)置幾個,或者設(shè)置為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、設(shè)置nginx進程 pid
pid logs/nginx.pid;
5、設(shè)置工作模式
events { # 默認使用epolL use epoll; # 每個worker允許連接的客戶端最大連接數(shù) worker_connections 1024; }
6、http 是指令塊,針對http網(wǎng)絡傳輸?shù)囊恍┲噶钆渲?/p>
http { }
7、include引入外部配置,提高可讀性,避免單個配置文件過大
include mime.types;
8、設(shè)定日志格式, 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;
參數(shù)名 | 參數(shù)意義 |
---|---|
$remote_addr | 客戶端ip |
$remote_user | 遠程客戶端用戶名,一般為:‘-’ |
$time_local | 時間和時區(qū) |
$request | 請求的url以及method |
$status | 響應的狀態(tài)碼 |
$body_bytes_sent | 響應客戶端內(nèi)容字節(jié)數(shù) |
$http_referer | 記錄用戶從哪個鏈接跳過來 |
$http_user_agent | 用戶所使用的代理,一般來時都是瀏覽器 |
$http_x_forwarded_for | 通過代理服務器來記錄客戶端的ip |
9、sendfile 使用高效文件傳輸,提升傳輸性能。啟用后才能使用 tcp_nopush,是指當數(shù)據(jù)表累積一定大小后才發(fā)送,提高了效率。
sendfile on; tcp_nopush on;
10、keepalive_timeout設(shè)置客戶端與服務端請求的超時時間,保證客戶端多次請求的時候不會重復建立新的連接,節(jié)約資源損耗。
#keepalive_timeout 0; keepalive_timeout 65;
11、gzip 啟用壓縮,html/js/css壓縮后傳輸會更快
#gzip on;
12、server 可以在 http指令塊中設(shè)置多個虛擬主機
- listen 監(jiān)聽端口
- server_name localhost、ip、域名
- location請求路由映射,匹配攔截
- root 請求位置
- index 首頁設(shè)置
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日志切割
手動切割
現(xiàn)有的日志都會存在 access.log 文件中,但是隨著時間的推移,這個文件的內(nèi)容會越來越多,體積會越來越大,不便于運維人員,查看,所以我們可以通過把這個大的日志文件切割為多份不同的小文件作為日志,切割規(guī)則可以以天 為單位,如果每天有幾百G或者幾個T的日志的話,則可以按需以每半天 或者 每小時 對日志切割一下。
具體步驟如下∶
1、到nginx的sbin目錄,創(chuàng)建一個shell可執(zhí)行文件∶ cut_my_log.sh,內(nèi)容為∶
#!/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主進程發(fā)送信號,用于重新打開日志文件 kill -USR1 `cat $PID`
2、為 cut_my_log.sh 添加可執(zhí)行的權(quán)限∶
chmod +x cut_my_log.sh
測試日志切割后的結(jié)果∶
./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 //關(guān)閉服務 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/... |
常用表達式∶
- 每分鐘執(zhí)行∶
*/1 * * * *
- 每日凌晨(每天晚上23∶59)執(zhí)行∶
59 23 * * *
- 每日凌晨1點執(zhí)行∶
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壓縮功能,目的∶提高傳輸效率,節(jié)約帶寬 gzip on; # 限制最小壓縮,小于1字節(jié)文件不會壓縮 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匹配規(guī)則解析
空格∶默認匹配,普通匹配
location / { root /home }
=∶精確匹配。
location = /imooc/img/face1.png { root /home; }
~*∶匹配正則表達式,不區(qū)分大小寫
# 符合圖片的顯示 location ~* \.(GIF|jpg|png|jpeg){ root /home; }
~∶匹配正則表達式,區(qū)分大小寫
# 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防盜鏈支持
為了 保證自己網(wǎng)站的靜態(tài)資源不能被其它網(wǎng)站引用,我們可以在nginx中做如下配置:
#對源站點驗證 valid_referers *.imooc.com; #非法引入會進入下方判斷 if ($invalid_referer) { return 404; }
Nginx負載均衡
OSI 網(wǎng)絡模型
在講到Nginx負載均衡的時候,其實Nginx是七層負載均衡,后續(xù)我們還會涉及到LVS,是四層負載均衡,七層和四層是什么概念呢?這就必須提到網(wǎng)絡模型。網(wǎng)絡模型是計算機網(wǎng)絡基礎(chǔ)的一部分內(nèi)容,一般大學計算機系都會講到此知識點,并且會作為考點;其實在面試過程中有時候也會被問到。所以我們還是有必要來復習或?qū)W習一下這塊的一些重要知識的。
網(wǎng)絡模型就是 OSI(0pen System Interconnect),意思為 開放網(wǎng)絡互聯(lián) ,是由國際標準化組織(ISO)和國際電報電話咨詢委員會(CCITT)共同出版的,他是一種網(wǎng)絡互聯(lián)模型,也是一種規(guī)范。
網(wǎng)絡模型分為七層,也就是當用戶發(fā)起請求到服務器接收,會歷經(jīng)七道工序,或者說用戶利用互聯(lián)網(wǎng)發(fā)送消息給另一個用戶,也會歷經(jīng)七道工序。這七層可以分為如下∶
層級 | 名稱 | 說明 |
---|---|---|
第七層 | 應用層 | 與用戶行為交互 |
第六層 | 表示層 | 定義數(shù)據(jù)格式以及數(shù)據(jù)加密 |
第五層 | 會話層 | 創(chuàng)建、管理以及銷毀會話 |
第四層 | 傳輸層 | 創(chuàng)建、管理請求端到響應端(端到端)的連接 |
第三層 | 網(wǎng)絡層 | 請求端的IP地址 |
第二層 | 數(shù)據(jù)鏈路層 | 提供介質(zhì)訪問與鏈路管理 |
第一層 | 物理層 | 傳輸介質(zhì),物理媒介 |
以上七層每層可以與上下相鄰層進行通信。每一層都是非常復雜的,我們不在這里深究,我們以舉例的形式來闡述每一層是干嘛的。
- 應用層: 這是面向用戶的,最靠近用戶,為了讓用戶和計算機交互,在計算機里會有很多軟件,比如eclipse,idea,qq,微信,淘寶等,這些都是應用軟件,用戶可以通過這些應用軟件和計算機交互,交互的過程其實就是接口的調(diào)用,應用層為用戶提供了交互的接口,以此為用戶提供交互服務。那么在這一層最常見的協(xié)議有∶HTTP,HTTPS,F(xiàn)TP,SMTP,POP3等。Nginx在本層,為七層負載均衡。
舉例∶我要寄一封信給遠在天邊的老外LiLei,我會打開快遞軟件下單,這個時候我是 用戶,快遞軟件就是 應用服務,是建立在計算機上的,提供給用戶交互的一種服務或稱之為手段。 - 表示層: 該層提供數(shù)據(jù)格式編碼以及加密功能,確保 請求端 的數(shù)據(jù)能被 響應端 的應用層識別。
舉例∶我寫中文給LiLei,他看不懂,這個時候我就會使用翻譯軟件把中文翻譯成英文,隨后信中涉及到一些比較隱私的信息我會加密一下,這個時候翻譯軟件和加密器就充當了 表示層 的作用,他用于顯示用戶能夠識別的內(nèi)容。 - 會話層: 會話可以理解為session,請求發(fā)送到接受響應的這個過程之間存在會話,會話層就充當了這一過程的管理者,從創(chuàng)建會話到維護會話最后銷毀會話。
舉例∶我每次寫信給LiLei都會記錄在一個小本本上,寄信時間日期,收信時間日期,這本小本本上存有每次通信記錄,這個小本本就相當于是一個會話的管理者。又或者說,我們平時在打電話,首先需要撥打電話,這是 建立會話 ,對方接聽電話,此時正在通話(維持并管理會話),通話結(jié)束后會話銷毀 ,那么這也是一次會話的生命周期。 - 傳輸層: 該層建立端到端的連接,他提供了數(shù)據(jù)傳輸服務,在傳輸層通信會涉及到端口號,本層常見的協(xié)議為TCP、UDP,LVS就是在傳輸層,也就是四層負載均衡。
舉例∶我和LiLei通信過程中會借助快遞公司,快遞公司會分配快遞員取件和寄件,那么這個快遞員則充當 傳輸層 的齋田。 - 網(wǎng)絡層: 網(wǎng)絡通信的時候必須要有本機IP和對方的IP,請求端和響應端都會有自己的IP的,IP就相當于你家地址門牌號,在網(wǎng)絡上云服務器有固定的公網(wǎng)IP,普通計算機也有,只不過是動態(tài)IP,運營商每天會分配不同的IP給你的計算機。所以網(wǎng)絡層也能稱之為IP層,IP是互聯(lián)網(wǎng)的基礎(chǔ)根本。能提供IP分配的設(shè)備則為路由器或交換機。
舉例∶對于擁有固定IP的云服務來說,他們都是由騰訊云、阿里云等這樣的供應商提供的,他們?yōu)樵品掌魈峁┕潭╥p ;電信、移動、聯(lián)調(diào)等運營商為你的計算機動態(tài)分配ip,每天都不同;則這些供應商和運營商都是網(wǎng)絡層。同理,快遞員由物流公司分配和管理,那么物流公司就是 網(wǎng)絡層 咯。 - 數(shù)據(jù)鏈路層: 這一層會提供計算機MAC地址,通信的時候會攜帶,為了確保請求投遞正確,所以他會驗證檢測MAC 地址,以確保請求響應的可靠性。
舉例∶快遞員在投遞派送的時候,他(或客服)會預先提前打電話給你,確認你家地址對不對、有沒有人、貨到付款有沒有準備好錢等等,這個時候快遞員(或客服)就充當了數(shù)據(jù)鏈路層 的職責。 - 物理層∶ 端到端請求響應過程中的媒介,物理介質(zhì),比如網(wǎng)線、中繼器等等設(shè)備,都是你在端到端交互過程中不可缺少的基礎(chǔ)設(shè)備。
舉例∶快遞員在投遞的過程中,你寫的信會歷經(jīng)一些交通運輸工具,比如首先通過飛機運輸?shù)絿?,在海關(guān)統(tǒng)一拿到信以后會通過汽車運輸?shù)絃iLei所在城市的物流集散地,最后快遞員通過三輪電頻車寄到LiLei家里,這個時候,飛機、汽車、三輪電瓶車都是 物理層 的媒介。
負載均衡策略:
輪詢:輪詢是Nginx負載均衡的默認策略。使用場景:針對每個服務器硬件配置一樣。
加權(quán)輪詢(weight):根據(jù)設(shè)置的權(quán)重值去分配處理請求的數(shù)量。使用場景:服務器硬件配置有差異,讓好的服務器去處理更多的請求。
ip_hash:對請求用戶的IP地址進行hash運算后得到的值,再對服務器數(shù)量進行取模運算。讓同一用戶的請求落到固定的服務器上。這樣就可以保證用戶訪問可以請求到上游服務中的固定的服務器,前提是用戶ip沒有發(fā)生更改。使用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值落在哈希環(huán)節(jié)點上,在用戶請求到Nginx時,根據(jù)順時針就近原則落到最近的服務器節(jié)點。
url_hash:根據(jù)每次請求的url地址,hash后訪問到固定的服務器節(jié)點。
upstream tomcats { # url hash hash $request_uri; # 最少連接數(shù) # 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指令參數(shù)
max_conns:限制每臺server的連接數(shù),用于保護避免過載,可起到限流作用。測試參考配置如下∶
# worker進程設(shè)置1個,便于測試觀察成功的連接數(shù) 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:商業(yè)版,需要付費。配置參考如下:
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; }
- 該參數(shù)不能使用在 hash 和 random Load balancing 中。
- 如果在 upstream 中只有一臺server,則該參數(shù)失效。
down、backup
down 用于標記服務節(jié)點不可用∶
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; }
表示當前服務器節(jié)點是備用機,只有在其他的服務器都宕機以后,自己才會加入到集群中,被用戶訪問到
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參數(shù)不能使用在 hash 和 random Load balancing 中。
max_fails、fail_timeout
- max_fails∶表示失敗幾次,則標記server已宕機,剔出上游服務。
- fail_timeout∶表示失敗的重試時間。假設(shè)目前設(shè)置如下∶
max_fails=2 fail_timeout=15s
則代表在15秒內(nèi)請求某一server失敗達到2次后,則認為該server已經(jīng)掛了或者宕機了,隨后再過15秒,這15秒內(nèi)不會有新的請求到達剛剛掛掉的節(jié)點上,而是會請求到正常運作的server,15秒后會再有新請求嘗試連接掛掉的server,如果還是失敗,重復上一過程,直到恢復。
Keepalived 提高吞吐量
keepalived
∶ 設(shè)置長連接處理的數(shù)量
proxy_http_version
∶設(shè)置長連接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)服務器的速度
- 用戶訪問仍然會產(chǎn)生請求流量
控制瀏覽器緩存
location /files { alias /home/imooc; # expires 10s; # expires @22h30m; # expires -1h; # expires epoch; # expires off; expires max; }
Nginx的反向代理緩存
# proxy_cache_path 設(shè)置緩存目錄# # keys_zone 設(shè)置共享內(nèi)存以及占用空間大小 # max_size 設(shè)置緩存大小 # 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狀態(tài)碼緩存時間為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 監(jiān)聽 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
總結(jié)
到此這篇關(guān)于Nginx的一些常用配置匯總的文章就介紹到這了,更多相關(guān)Nginx常用配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx 轉(zhuǎn)發(fā)匹配規(guī)則的實現(xiàn)
這篇文章主要介紹了Nginx 轉(zhuǎn)發(fā)匹配規(guī)則的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03nginx rewrite重寫規(guī)則與防盜鏈配置方法教程詳解
這篇文章主要介紹了nginx rewrite重寫規(guī)則與防盜鏈配置方法教程詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09詳解Nginx靜態(tài)服務配置(root和alias指令)
這篇文章主要介紹了詳解Nginx靜態(tài)服務配置(root和alias指令),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01