本章目錄
1.引言
- 1.1 目的
- 1.2 目標(biāo)范圍
- 1.3 讀者對(duì)象
2.參考說明
- 2.1 幫助參考
- 2.2 參數(shù)說明
- 3.3 模塊說明
3.服務(wù)優(yōu)化
- 3.1 系統(tǒng)內(nèi)核
- 3.2 編譯優(yōu)化
- 3.3 性能優(yōu)化
- 3.4 運(yùn)營優(yōu)化
- 3.5 配置優(yōu)化
4.安全配置
- 0.隱藏nginx服務(wù)及其版本
- 1.低權(quán)限用戶運(yùn)行服務(wù)
- 2.配置SSL及其會(huì)話復(fù)用
- 3.限制SSL協(xié)議與加密套件
- 4.攔截垃圾信息
- 5.惡意掃描攔截
- 6.禁用WebDAV
- 7.禁用Nginx狀態(tài)模塊
- 8.關(guān)閉默認(rèn)錯(cuò)誤頁上的Nginx版本號(hào)
- 9.設(shè)置client_body_timeout超時(shí)
- 10.設(shè)置client_header_timeout
- 11.設(shè)置keepalive_timeout超時(shí)
- 12.設(shè)置send_timeout超時(shí)
- 13.Nginx可用的方法應(yīng)限制為GET, HEAD, POST
- 14.控制并發(fā)連接limit_zone slimits
- 15.控制并發(fā)連接limit_conn slimits
- 16.主機(jī)防webshell跨目錄瀏覽以及列目錄
- 17.文件名解析漏洞php_info,加入fcgi.conf即可
- 18.訪問權(quán)限控制nginx
- 19.異常狀態(tài)返回200隱藏URL
- 20.安全模塊的選擇
- 21.記錄訪問者真實(shí)IP
- 22.地區(qū)訪問響應(yīng)措施
- 23.資源防盜鏈設(shè)置
- 24.常規(guī)安全響應(yīng)頭配置
- 25.防止非所屬域名解析到服務(wù)器
- 25.限制指定客戶端地址訪問
5.配置說明
6.補(bǔ)充知識(shí)
<center>
修訂控制頁
版本 | 修訂日期 | 修訂人 | 修訂摘要 |
---|---|---|---|
1.0 | 2019年9月8日 09點(diǎn)18分 | WeiyiGeek | 初稿 |
2.0 | 2022年1月8日 18點(diǎn)18分 | WeiyiGeek | 擴(kuò)充 |
</center>
前置基礎(chǔ)知識(shí)學(xué)習(xí)
1.Nginx基礎(chǔ)安裝與配置詳細(xì) https://blog.weiyigeek.top/2019/9-1-121.html
2.Nginx進(jìn)階學(xué)習(xí)之最佳配置實(shí)踐指南 https://blog.weiyigeek.top/2019/9-1-124.html
3.Nginx模塊學(xué)習(xí)使用實(shí)踐指南 https://blog.weiyigeek.top/2021/3-1-633.html
4.Nginx安全加固與性能調(diào)優(yōu)最佳指南 https://blog.weiyigeek.top/2019/9-2-122.html
5.Nginx常遇問題入坑出坑整理 https://blog.weiyigeek.top/2020/9-2-622.html
1.引言
1.1 目的
為了更好的指導(dǎo)部署與測(cè)試藝術(shù)升系統(tǒng)nginx網(wǎng)站服務(wù)器高性能同時(shí)下安全穩(wěn)定運(yùn)行,需要對(duì)nginx服務(wù)進(jìn)行調(diào)優(yōu)與加固;
本次進(jìn)行Nginx服務(wù)調(diào)優(yōu)加固主要從以下幾個(gè)部分:
- 模塊性能優(yōu)化
- 系統(tǒng)內(nèi)核優(yōu)化
- 編譯安裝優(yōu)化
- 性能參數(shù)優(yōu)化
- 安全加固配置
1.2 目標(biāo)范圍
本文檔僅供內(nèi)部使用椰弊,禁止外傳许溅,幫助研發(fā)人員,運(yùn)維人員對(duì)系統(tǒng)長期穩(wěn)定的運(yùn)行提供技術(shù)文檔參考秉版。
1.3 讀者對(duì)象
- 項(xiàng)目經(jīng)理
- 開發(fā)人員
- 測(cè)試人員
- 運(yùn)維人員
- 相關(guān)領(lǐng)導(dǎo)
2.參考說明
2.1 幫助參考
Nginx是一個(gè)高性能的HTTP和反向代理服務(wù)器贤重,也是一個(gè)IMAP/POP3/SMTP服務(wù)器。Nginx作為負(fù)載均衡服務(wù)器, Nginx 既可以在內(nèi)部直接支持 Rails 和 PHP 程序?qū)ν膺M(jìn)行服務(wù)清焕,也可以支持作為 HTTP代理服務(wù)器對(duì)外進(jìn)行服務(wù)并蝗。
Nginx版本選擇:
- Mainline version 最新版本,推薦測(cè)試的業(yè)務(wù)項(xiàng)目的時(shí)候使用
- Stable version 穩(wěn)定版本,推薦項(xiàng)目上線實(shí)際使用
- Legacy versions 歷史版本,不推薦選擇可能存在脆弱性漏洞
項(xiàng)目結(jié)構(gòu):
#編譯后的nginx項(xiàng)目結(jié)結(jié)構(gòu)
/etc/nginx/
├── client_body_temp #客戶端上面的臨時(shí)文件存放目錄
├── conf #nginx的配置文件存放目錄
├── fastcgi_temp #fastcgi的臨時(shí)文件存放目錄
├── html #存放靜態(tài)資源或者腳本文件的地方
├── logs #nginx日志文件
├── proxy_temp #nginx正向/反向代理緩存文件存放目錄
├── sbin #nginx可執(zhí)行文件
├── scgi_temp #scgi臨時(shí)文件目錄
└── uwsgi_temp #uwsgi臨時(shí)文件存放目錄
Nginx文檔幫助: http://nginx.org/en/docs/
Nginx首頁地址目錄: /usr/share/nginx/html
Nginx配置文件:
- /etc/nginx/nginx.conf
- /usr/local/nginx/conf/nginx.conf
- /usr/local/etc/nginx/nginx.conf
2.2 參數(shù)說明
localtion 請(qǐng)求匹配的url實(shí)是一個(gè)正則表達(dá)式:
# 語法規(guī)則:
location [=|~|~*|^~] /uri/ { ... }
# 參數(shù)解析:
= 表示精確匹配,這個(gè)優(yōu)先級(jí)也是最高的
/ 通用匹配,任何請(qǐng)求都會(huì)匹配到秸妥,默認(rèn)匹配.
~ 表示區(qū)分大小寫的正則匹配
~* 表示不區(qū)分大小寫的正則匹配(和上面的唯一區(qū)別就是大小寫) !~和!~*分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配的正則
!~,!~* : 分別標(biāo)識(shí)為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配的正則
^~ 表示 uri 以某個(gè)常規(guī)字符串開頭滚停,理解為匹配 url 路徑即可。nginx 不對(duì) url 做編碼粥惧,因此請(qǐng)求為/static/20%/aa键畴,可以被規(guī)則^~ /static/ /aa 匹配到(注意是空格)
Nginx 匹配判斷表達(dá)式:
-f 和 !-f: 用來判斷是否存在文件
-d 和 !-d: 用來判斷是否存在目錄
-e 和 !-e: 用來判斷是否存在文件或目錄
-x 和 !-x: 用來判斷文件是否可執(zhí)行
例如,匹配末尾為如下后綴的靜態(tài)并判斷是否存在該文件, 如不存在則404。
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
return 403;
break;
}
}
3.3 模塊說明
查看可用模塊編譯參數(shù):http://nginx.org/en/docs/configure.html
#可以通過運(yùn)行 "./configure --help" 查看編譯幫助突雪,決定是否需要安裝哪些模塊,比如下面的ssi模塊能夠?qū)崿F(xiàn)訪問shtml頁面
./configure -help
http_gzip模塊
開啟gzip壓縮輸出(常常是大于1kb的靜態(tài)文件)起惕,減少網(wǎng)絡(luò)傳輸;
gzip_min_length 1k #設(shè)置允許壓縮的頁面最小字節(jié)數(shù)頁面字節(jié)數(shù)從content-length中進(jìn)行獲取,默認(rèn)值是20
gzip_buffers 4 16k #設(shè)置系統(tǒng)獲取幾個(gè)單位的緩存用于存儲(chǔ)gzip的壓縮結(jié)果數(shù)據(jù)流。4 16k代表以16k為單位挂签,安裝原始數(shù)據(jù)大小以16k為單位的4倍申請(qǐng)內(nèi)存疤祭。
gzip_comp_level 2 #gzip壓縮比,其值從1到9數(shù)字越大壓縮率越高饵婆,越消耗CPU負(fù)載也越高
gzip_types #匹配mime類型進(jìn)行壓縮勺馆,無論是否指定”text/html”類型總是會(huì)被壓縮的,推薦配置:`gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript侨核。`
gzip_http_version 1.0 #用于識(shí)別 http 協(xié)議的版本早期的瀏覽器不支持 Gzip 壓縮草穆,用戶就會(huì)看到亂碼,所以為了支持前期版本加上了這個(gè)選項(xiàng);如果你用了 Nginx 的反向代理并期望也啟用 Gzip 壓縮的話搓译,由于末端通信是 http/1.0悲柱,故請(qǐng)?jiān)O(shè)置為 1.0。
gzip_proxied any #Nginx作為反向代理的時(shí)候啟用些己,決定開啟或者關(guān)閉后端服務(wù)器返回的結(jié)果是否壓縮豌鸡,匹配的前提是后端服務(wù)器必須要返回包含”Via”的 header頭嘿般。
gzip_vary on #和http頭有關(guān)系會(huì)在響應(yīng)頭加個(gè) Vary: Accept-Encoding ,可以讓前端的緩存服務(wù)器緩存經(jīng)過gzip壓縮的頁面涯冠,例如用Squid緩存經(jīng)過Nginx壓縮的數(shù)據(jù)炉奴。
http_fastcgi_module模塊
nginx可以用來請(qǐng)求路由到FastCGI服務(wù)器運(yùn)行應(yīng)用程序由各種框架和PHP編程語言等∩吒可以開啟FastCGI的緩存功能以及將靜態(tài)資源進(jìn)行剝離瞻赶,從而提高性能。
指令:fastcgi_temp_path #定義FastCGI緩存文件保存臨時(shí)路徑派任。
指令:fastcgi_cache_path #定義FastCGI緩存文件保存路徑和緩存的其它參數(shù)砸逊。緩存數(shù)據(jù)以二進(jìn)制數(shù)據(jù)文件形式存儲(chǔ),緩存文件名和key都是通過對(duì)訪問URL使用MD5計(jì)算獲得的結(jié)果掌逛。緩存文件先保存至fastcgi_temp_path指定的臨時(shí)目錄下师逸,然后通過重命名操作移至fastcgi_cache_path指定的緩存目錄。建議fastcgi_temp_path和fastcgi_cache_path設(shè)為同一分區(qū)颤诀,同分區(qū)移動(dòng)操作效率更高字旭。示例:
fastcgi_temp_path /tmp/fastcgi_temp;
fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:16m inactive=30m max_size=1g;
# levels指定了目錄結(jié)構(gòu),子目錄數(shù)以16為基數(shù);
# keys_zone指定了共享內(nèi)存區(qū)名和大小崖叫,用于保存緩存key和數(shù)據(jù)信息;
# inactive指定了緩存數(shù)據(jù)保存的時(shí)間拍柒,當(dāng)這段時(shí)間內(nèi)未被訪問將被移出心傀;
# max_size指定了緩存使用的最大磁盤空間,超過容量時(shí)將最近最少使用數(shù)據(jù)刪除拆讯。
#示例中使用/tmp/fastcgi_temp作為FastCGI緩存的臨時(shí)目錄脂男;/tmp/fastcgi_cache作為FastCGI緩存保存的最終目錄;一級(jí)子目錄為16的一次方16個(gè)种呐,二級(jí)子目錄為16的2次方256個(gè)宰翅;共享內(nèi)存區(qū)名為cache_fastcgi,占用內(nèi)存128MB爽室;緩存過期時(shí)間為30分鐘汁讼;緩存數(shù)據(jù)保存于磁盤的最大空間大小為1GB。
指令:fastcgi_cache_key # 定義FastCGI緩存關(guān)鍵字阔墩。啟用FastCGI緩存必須加上這個(gè)配置嘿架,不然訪問所有PHP的請(qǐng)求都為訪問第一個(gè)PHP文件URL的結(jié)果。
指令:fastcgi_cache_valid # 為指定的Http狀態(tài)碼指定緩存時(shí)間啸箫。
指令:fastcgi_cache_min_uses # 指定經(jīng)過多少次請(qǐng)求相同的URL將被緩存耸彪。
指令:fastcgi_cache_use_stale # 指定當(dāng)連接FastCGI服務(wù)器發(fā)生錯(cuò)誤時(shí),哪些情況使用過期數(shù)據(jù)回應(yīng)忘苛。
指令:fastcgi_cache # 緩存使用哪個(gè)共享內(nèi)存區(qū)
keepalive模塊
長連接對(duì)性能有很大的影響蝉娜,通過減少CPU和網(wǎng)絡(luò)開銷需要開啟或關(guān)閉連接;
- keepalive_timeout 閑長連接保持打開狀態(tài)的時(shí)間;
- keepalive_requests 單個(gè)客戶端長連接可以請(qǐng)求的數(shù)量;
- keepalive 上游服務(wù)器長連接的相關(guān)指令唱较,每個(gè)工作進(jìn)程中空閑長連接到上游服務(wù)器保持開啟的連接數(shù)量(沒有默認(rèn)值)。
要使用連接到上游服務(wù)器的長連接召川,必須要配置文件中下面的指令:
proxy_http_version 1.1;
proxy_set_header Connection "";
http_ssl_module模塊
Nginx開啟支持Https協(xié)議的SSL模塊
#Nginx SSL性能調(diào)優(yōu)
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#注意這里的加密方式
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
3.服務(wù)優(yōu)化
3.1 系統(tǒng)內(nèi)核
Linux內(nèi)核參數(shù)部分默認(rèn)值不適合高并發(fā),Linux內(nèi)核調(diào)優(yōu)南缓,主要涉及到網(wǎng)絡(luò)和文件系統(tǒng)、內(nèi)存等的優(yōu)化扮宠,
- 臨時(shí)方法可以通過調(diào)整/Proc文件系統(tǒng)西乖,需要注意調(diào)整/Proc文件系統(tǒng)系統(tǒng)重啟后還原至默認(rèn)值(不推薦)。
- 永久修改/etc/sysctl.conf配置文件永久保存
下面是我常用的內(nèi)核調(diào)優(yōu)配置:
grep -q "net.ipv4.tcp_max_tw_buckets" /etc/sysctl.conf || cat >> /etc/sysctl.conf << EOF
########################################
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
#緩沖區(qū)隊(duì)列設(shè)置與連接及其如何排隊(duì)相關(guān)#
#調(diào)節(jié)系統(tǒng)同時(shí)發(fā)起的tcp連接數(shù)坛增,在高并發(fā)的請(qǐng)求中获雕,默認(rèn)的值可能會(huì)導(dǎo)致鏈接超時(shí)或者重傳,因此需要結(jié)合并發(fā)請(qǐng)求數(shù)來調(diào)節(jié)此值收捣。
#net.core.somaxconn = 262144
#在提交到CPU前網(wǎng)卡中數(shù)據(jù)包緩沖的速率届案,高帶寬下提高這個(gè)值可提高性能;檢查內(nèi)核日志文件中有關(guān)這個(gè)設(shè)置的錯(cuò)誤,根據(jù)網(wǎng)卡文檔中的建議修改這個(gè)值罢艾。
net.core.netdev_max_backlog = 262144
#設(shè)定系統(tǒng)中最多有多少個(gè)TCP套接字不被關(guān)聯(lián)到任何一個(gè)用戶文件句柄上
net.ipv4.tcp_max_orphans = 262144
#用于記錄那些尚未收到客戶端確認(rèn)信息的連接請(qǐng)求的最大值(根據(jù)類才更改)
net.ipv4.tcp_max_syn_backlog = 1024
#設(shè)定timewait的數(shù)量默認(rèn)是180000設(shè)為10000楣颠。
net.ipv4.tcp_max_tw_buckets = 10000
#在高并發(fā)情況端口值的起止范圍一般端口號(hào)設(shè)置是1024到65000,用來設(shè)定允許系統(tǒng)打開的端口范圍;
net.ipv4.ip_local_port_range = 1024 65500
#用于設(shè)置啟用timewait快速回收
net.ipv4.tcp_tw_recycle = 1
#用于設(shè)置開啟重用,允許將TIME-WAIT sockets重新用于新的TCP連接咐蚯。
net.ipv4.tcp_tw_reuse = 1
#用于設(shè)置開啟SYN Cookies童漩,當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies進(jìn)行處理春锋。
net.ipv4.tcp_syncookies = 1
#決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK包的數(shù)量矫膨。
net.ipv4.tcp_synack_retries = 1
#表示在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量。
net.ipv4.tcp_syn_retries = 1
#決定了套接字保持在FIN-WAIT-2狀態(tài)的時(shí)間期奔。默認(rèn)值是60秒侧馅。
#正確設(shè)置這個(gè)值非常重要,有時(shí)即使一個(gè)負(fù)載很小的Web服務(wù)器呐萌,也會(huì)出現(xiàn)大量的死套接字而產(chǎn)生內(nèi)存溢出的風(fēng)險(xiǎn)馁痴。
net.ipv4.tcp_fin_timeout = 30
#選項(xiàng)表示當(dāng)keepalive啟用的時(shí)候,TCP發(fā)送keepalive消息的頻度肺孤。默認(rèn)值是2(單位是小時(shí))罗晕。
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_mem = 786432 1048576 1572864
#文件描述符系統(tǒng)級(jí)別的限制#
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
vm.swappiness = 10
fs.aio-max-nr = 1048576
EOF
sysctl -p
文件描述符
文件描述符是操作系統(tǒng)資源,用于表示連接渠旁、打開的文件攀例,以及其他信息。NGINX 每個(gè)連接可以使用兩個(gè)文件描述符顾腊。
例如如果NGINX充當(dāng)代理時(shí)粤铭,通常一個(gè)文件描述符表示客戶端連接,另一個(gè)連接到代理服務(wù)器杂靶,如果開啟了HTTP 保持連接梆惯,這個(gè)比例會(huì)更低(譯注:為什么更低呢)酱鸭。
對(duì)于有大量連接服務(wù)的系統(tǒng),下面的設(shè)置可能需要調(diào)整一下:
#修改文件描述符方式
vim /etc/security/limits.conf
* - nofile 65536 #用戶級(jí)別文件描述符限制
#然后進(jìn)行啟動(dòng)文件修改
echo "ulimit -Hsn 65536" >> /etc/profile
3.2 編譯優(yōu)化
精簡模塊:Nginx由于不斷添加新的功能垛吗,附帶的模塊也越來越多,建議一般常用的服務(wù)器軟件使用源碼編譯安裝管理
;
(1) 減小Nginx編譯后的文件大小
- 編譯Nginx時(shí)默認(rèn)以debug模式進(jìn)行凹髓,而在debug模式下會(huì)插入很多跟蹤和ASSERT之類的信息,編譯完成后一個(gè)Nginx要有好幾兆字節(jié);因此可以在編譯之前,修改相關(guān)源碼,取消debug模式;
# 找到源碼目錄下 auto/cc/gcc 文件 debug
CFLAGS="$CFLAGS -g" #注釋掉或刪掉這兩行刃泡,即可取消debug模式。
ls -alh /usr/local/nginx/sbin/nginx
-rwxr-xr-x. 1 root root 915K Aug 17 09:49 /usr/local/nginx/sbin/nginx #可以看到體積大大減少
(2) 指定GCC編譯參數(shù)
修改GCC編譯參數(shù)提高編譯優(yōu)化級(jí)別穩(wěn)妥起見采用 -O2
這也是大多數(shù)軟件編譯推薦的優(yōu)化級(jí)別赌躺。
- Nginx源碼文件 auto/cc/gcc 搜索 NGX_GCC_OPT默認(rèn)GCC編譯參數(shù)為-O,可以直接修改內(nèi)容為
NGX_GCC_OPT="-O2" 或者在 ./configure配置時(shí)添加--with-cc-opt='-O2'選項(xiàng)
羡儿。
--with-cc-opt='-O3' #編譯級(jí)別
--with-cpu-opt=CPU #為特定的 CPU 編譯礼患,有效的值包括:pentium, pentiumpro, pentium3, # pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
GCC編譯參數(shù)優(yōu)化 [可選項(xiàng)] 總共提供了5級(jí)編譯優(yōu)化級(jí)別:
- -O0:無優(yōu)化。
- -O和-O1:使用能減少目標(biāo)代碼尺寸以及執(zhí)行時(shí)間并且不會(huì)使編譯時(shí)間明顯增加的優(yōu)化掠归,在編譯大型程序的時(shí)候會(huì)顯著增加編譯時(shí)內(nèi)存的使用缅叠。
- -O2:包含-O1的優(yōu)化并增加了不需要在目標(biāo)文件大小和執(zhí)行速度上進(jìn)行折衷的優(yōu)化。編譯器不執(zhí)行循環(huán)展開以及函數(shù)內(nèi)聯(lián)虏冻。此選項(xiàng)將增加編譯時(shí)間和目標(biāo)文件的執(zhí)行性能肤粱。
- -Os:可以看成 -O2.5,專門優(yōu)化目標(biāo)文件大小厨相,執(zhí)行所有的不增加目標(biāo)文件大小的-O2優(yōu)化選項(xiàng)狼犯,并且執(zhí)行專門減小目標(biāo)文件大小的優(yōu)化選項(xiàng)。適用于磁盤空間緊張時(shí)使用领铐。但有可能有未知的問題發(fā)生,況且目前硬盤容量很大宋舷,常用程序無必要使用绪撵。
- -O3:打開所有 -O2 的優(yōu)化選項(xiàng)外增加 -finline-functions、-funswitch-loops祝蝠、-fgcse-after-reload 優(yōu)化選項(xiàng)音诈。相對(duì)于 -O2 性能并未有較多提高,編譯時(shí)間也最長绎狭,生成的目標(biāo)文件也更大更占內(nèi)存细溅,有時(shí)性能不增反而降低,甚至產(chǎn)生不可預(yù)知的問題(包括錯(cuò)誤)儡嘶,所以并不被大多數(shù)軟件安裝推薦喇聊,除非有絕對(duì)把握方可使用此優(yōu)化級(jí)別。
常用編譯參數(shù):
#編譯0:常規(guī)編譯參數(shù)
configure arguments:
#安裝的目錄或者路徑#
--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib64/nginx/modules
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
#執(zhí)行對(duì)應(yīng)模塊nginx所保留的臨時(shí)文件#
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
#啟動(dòng)的用戶和組用戶#
--user=nginx
--group=nginx
#模塊參數(shù)#
--with-compat
--with-file-aio
--with-threads
--with-http_addition_module
--with-http_auth_request_module
--with-http_dav_module
--with-http_flv_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_mp4_module
--with-http_random_index_module
--with-http_realip_module
--with-http_secure_link_module
--with-http_slice_module
--with-http_ssl_module
--with-http_stub_status_module
--with-http_sub_module
--with-http_v2_module
--with-mail
--with-mail_ssl_module
--with-stream
--with-stream_realip_module
--with-stream_ssl_module
--with-stream_ssl_preread_module
#設(shè)置額外的參數(shù)將被添加到CFLAGS#
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC'
#設(shè)置附件參數(shù),鏈接系統(tǒng)庫#
-with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
#編譯1:除多余模塊
./configure \
"--prefix=/App/nginx" \
"--user=nginx" \
"--group=nginx" \
"--with-http_stub_status_module" \
"--without-http_auth_basic_module" \
"--without-http_autoindex_module" \
"--without-http_browser_module" \
"--without-http_empty_gif_module" \
"--without-http_geo_module" \
"--without-http_limit_conn_module" \
"--without-http_limit_req_module" \
"--without-http_map_module" \
"--without-http_memcached_module" \
"--without-http_proxy_module" \
"--without-http_referer_module" \
"--without-http_scgi_module" \
"--without-http_split_clients_module" \
"--without-http_ssi_module" \
"--without-http_upstream_ip_hash_module" \
"--without-http_upstream_keepalive_module" \
"--without-http_upstream_least_conn_module" \
"--without-http_userid_module" \
"--without-http_uwsgi_module" \
"--without-mail_imap_module" \
"--without-mail_pop3_module" \
"--without-mail_smtp_module" \
"--without-poll_module" \
"--without-select_module" \
"--with-cc-opt='-O2'"
3.3 性能優(yōu)化
緩存和壓縮與限制可以提高性能
NGINX的一些額外功能可用于提高Web應(yīng)用的性能蹦狂,調(diào)優(yōu)的時(shí)候web應(yīng)用不需要關(guān)掉但值得一提誓篱,因?yàn)樗鼈兊挠绊懣赡芎苤匾?/p>
- 1)緩存
一個(gè)啟用NGINX緩存的情景朋贬,一組web或者應(yīng)用服務(wù)器負(fù)載均衡,可以顯著縮短對(duì)客戶端的響應(yīng)時(shí)間窜骄,同時(shí)大幅度降低后端服務(wù)器的負(fù)載锦募。緩存本身就可以作個(gè)專題來講,這里我們就不試圖講它了邻遏。
# 網(wǎng)頁資源緩存
location ~* \.(xml|html|htm)$ {
# 資源決絕對(duì)目錄設(shè)置
root /var/www/html;
# 日志文件的相對(duì)路徑或完整路徑
access_log /path/to/file.log;
# 開啟日志記錄
access_log on;
# 設(shè)置過期時(shí)間
expires 24h;
}
# 樣式糠亩、JS、圖片資源緩存
location ~* \.(css|js|ico|gif|jpg|jpeg|png)$ {
root /var/www/html/res;
# 禁用404錯(cuò)誤日志
log_not_found off;
# 關(guān)閉日志
access_log off;
# 緩存時(shí)間7天
expires 7d;
}
# 字體資源緩存
location ~* \.(eot|ttf|otf|woff|woff2|svg)$ {
root /var/www/html/static;
log_not_found off;
access_log off;
expires max;
}
- 2)壓縮
所以使用更小的網(wǎng)絡(luò)帶寬准验。然而盡管壓縮數(shù)據(jù)會(huì)消耗CPU資源赎线,但當(dāng)需要減少網(wǎng)絡(luò)帶寬使用時(shí)這樣做非常有效。需要注意的是沟娱,不能對(duì)已壓縮的文件再壓縮例如JPEG 文件氛驮。
# 啟用 gzip 壓縮
gzip on;
# 啟用gzip壓縮的最小文件,小于設(shè)置值的文件將不會(huì)壓縮
gzip_min_length 2k;
# gzip 壓縮級(jí)別济似,1-10矫废,數(shù)字越大壓縮的越好,也越占用CPU時(shí)間砰蠢,后面會(huì)有詳細(xì)說明
gzip_comp_level 2;
# 進(jìn)行壓縮的文件類型蓖扑,javascript有多種形,其中的值可以在 mime.types 文件中找到台舱。
gzip_types text/plain text/css text/javascript application/javascript application/x-javascript application/xml application/x-httpd-php image/x-icon image/jpeg image/gif image/png image/svg+xml image/avif image/webp font/ttf font/opentype;
# 建議在http header中添加Vary: Accept-Encoding支持
gzip_vary on;
- 3)限制
防止用戶消耗太多的資源律杠,避免影響系統(tǒng)性能和用戶體驗(yàn)及安全性,以下是相關(guān)的指令:
limit_conn and limit_conn_zone # NGINX接受客戶連接的數(shù)量限制竞惋,例如單個(gè)IP地址的連接柜去。設(shè)置這些指令可以防止單個(gè)用戶打開太多的連接,消耗超出自己的資源拆宛。
limit_req and limit_req_zon #NGINX處理請(qǐng)求的速度限制嗓奢,與limit_rate有相同的功能』牒瘢可以提高安全性股耽,尤其是對(duì)登錄頁面,通過對(duì)用戶限制請(qǐng)求速率設(shè)置一個(gè)合理的值钳幅,避免太慢的程序覆蓋你的應(yīng)用請(qǐng)求(比如DDoS攻擊)物蝙。
limit_rate # 傳輸?shù)娇蛻舳隧憫?yīng)速度的限制(每個(gè)打開多個(gè)連接的客戶消耗更多的帶寬)。設(shè)置這個(gè)限制防止系統(tǒng)過載敢艰,確保所有客戶端更均勻的服務(wù)質(zhì)量诬乞。
max_conns #上游配置塊中服務(wù)器指令參數(shù)。在上游服務(wù)器組中單個(gè)服務(wù)器可接受最大并發(fā)數(shù)量。使用這個(gè)限制防止上游服務(wù)器過載丽惭。設(shè)置值為0(默認(rèn)值)表示沒有限制击奶。
queue (NGINX Plus - 商業(yè)版本提供) # 創(chuàng)建一個(gè)隊(duì)列,用來存放在上游服務(wù)器中超出他們最大max_cons限制數(shù)量的請(qǐng)求责掏。這個(gè)指令可以設(shè)置隊(duì)列請(qǐng)求的最大值柜砾,還可以選擇設(shè)置在錯(cuò)誤返回之前最大等待時(shí)間(默認(rèn)值是60秒)。如果忽略這個(gè)指令换衬,請(qǐng)求不會(huì)放入隊(duì)列痰驱。
簡單示例:
http {
# 請(qǐng)根據(jù)業(yè)務(wù)需求配置同一IP地址連接數(shù)
limit_conn_zone $binary_remote_addr zone=www_weiyigeek_top:10m;
# 請(qǐng)根據(jù)業(yè)務(wù)需求配置同一IP地址請(qǐng)求速率
limit_req_zone $binary_remote_addr zone=blog_weiyigeek_top:10m rate=1r/s;
server {
# 建議創(chuàng)建黑白名單
allow 內(nèi)部IP或負(fù)載均衡IP;
deny 惡意IP;
# 限流
location ^~ /download/ {
# 表示單個(gè)IP連接數(shù)不超過 2 個(gè)
limit_conn www_weiyigeek_top 2;
# 表示單個(gè)IP請(qǐng)求速率為1s一個(gè), 允許超過頻率限制的請(qǐng)求數(shù)不多于5個(gè),最多請(qǐng)求不能超過 burst + rate 數(shù)量瞳浦。
limit_req zone=blog_weiyigeek_top burst=5 nodelay;
alias /data/weiyigeek.top/download/;
}
}
}
- 4)減少磁盤IO
減少磁盤IO次數(shù)可以幫助我們更好的提升服務(wù)器性能担映,增強(qiáng)服務(wù)器的負(fù)載能力。
# 關(guān)閉不需要記錄指定目錄或者文件訪問日志
access_log off;
error_log /dev/null
# 為日志寫入創(chuàng)建緩存區(qū)減少IO次數(shù),例如下面當(dāng)緩存達(dá)到128k或者日志刷新時(shí)間為1m時(shí)將寫入日志文件中(gzip 壓縮日志-按需開啟)
access_log /var/log/nginx/access.log main buffer=128k gzip flush=1m;
3.4 運(yùn)營優(yōu)化
1) 永久重定向
如果你的站點(diǎn)需要讓http URL跳轉(zhuǎn)到https,則非建議設(shè)置永久重定向叫潦,而非臨時(shí)重定向蝇完,這可以幫助你站點(diǎn)更好的被收錄(SEO)。
例如矗蕊,配置 http 向 https 跳轉(zhuǎn) (永久)
# 方式1.Redirect(重定向)- 推薦
server {
listen 80;
server_name weiyigeek.top www.weiyigeek.top;
return 301 https://$host$request_uri;
}
# 方式2.ReWrite 重寫
server {
listen 80;
server_name weiyigeek.top www.weiyigeek.top;
# 判斷請(qǐng)求host是否是 www.weiyigeek.top ,如果是 weiyigeek.top 則重寫為 www.weiyigeek.top
if ($http_host !~ "^www\.weiyigeek\.top$" {
rewrite ^(.*) https://www.weiyigeek.top$1 permanent;
}
}
3.5 配置優(yōu)化
nginx配置文件指令優(yōu)化一覽表
位置 | 指令 | 說明 | 優(yōu)化 | ||
---|---|---|---|---|---|
main | worker_processes | 工作進(jìn)程數(shù)的選擇包括(但不限于)CPU核心的數(shù)量短蜕、存儲(chǔ)數(shù)據(jù)的硬盤數(shù)量及負(fù)載模式 | 設(shè)置 auto 或者 <b> `cat /proc/cpuinfo | grep processor | wc -l` </b> 服務(wù)器邏輯核心總數(shù) |
main | worker_cpu_affinity | Nginx默認(rèn)未開啟CPU綁定,綁定工作進(jìn)程到對(duì)應(yīng)CPU核心 | 多核CPU建議設(shè)置CPU綁定,綁定樣例: <b> worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; </b> |
||
main | worker_rlimit_nofile | 打開文件數(shù)限制(默認(rèn)值1024),受限于系統(tǒng)的用戶進(jìn)程打開文件數(shù)限制傻咖,未設(shè)置則使用系統(tǒng)默認(rèn)值 | 修改用戶打開文件數(shù)限制: <b> echo "* - nofile 65536" >> /etc/security/limits.conf </b> 修改所有Shell和通過Shell啟動(dòng)的進(jìn)程打開文件數(shù)限制: <b> echo "ulimit -n 65536" >> /etc/profile </b>臨時(shí)生效(重啟后生效): ulimit -n 65536 |
||
main | worker_connections | Nginx一個(gè)工作進(jìn)程的最大同時(shí)連接數(shù)朋魔,不僅限于客戶端連接,包括了和后端被代理服務(wù)器等其他的連接 | 建議設(shè)置成與 <b> worker_rlimit_nofile </b> 值相等 |
||
mian | sendfile | 在http或server或location環(huán)境中包含sendfile指令卿操。 NGINX可以不需要切換到用戶態(tài)警检,就把緩存或磁盤上的內(nèi)容寫入套接字而且寫的速度非常快害淤,消耗更少的CPU周期扇雕。 注意盡管使用sendfile()數(shù)據(jù)拷貝可以繞過用戶態(tài)但不適用于常規(guī)的NGINX處理改變內(nèi)容的鏈和過濾器比如gzip |
建議設(shè)置成 on | ||
main-events | accept_mutex | 驚群問題: 如果指令值為 on 啟用,那么將輪流喚醒一個(gè)工作進(jìn)程接收處理新的連接窥摄,其余工作進(jìn)程繼續(xù)保持睡眠 如果指令值為 off 關(guān)閉洼裤,那么將喚醒所有工作進(jìn)程,由系統(tǒng)通過use指令指定的網(wǎng)絡(luò)IO模型調(diào)度決定由哪個(gè)工作進(jìn)程處理溪王,未接收到連接請(qǐng)求的工作進(jìn)程繼續(xù)保持睡眠 |
on開啟狀態(tài)為了穩(wěn)定參數(shù)值; off關(guān)閉狀態(tài)提高性能和吞吐量但是會(huì)帶來上下文切換增多或者負(fù)載升高等等其它資源更多消耗的后果(推薦) |
||
main-events | use | 定義了Nginx設(shè)置用于復(fù)用客戶端線程的輪詢方法(也可稱多路復(fù)用網(wǎng)絡(luò)IO模型),自然是選擇效率更高的優(yōu)先(默認(rèn)即可) | use epoll | ||
main | open_file_cache | 開啟關(guān)閉打開文件緩存默認(rèn)值 off 關(guān)閉,強(qiáng)烈建議開啟可以避免重新打開同一文件帶來的系統(tǒng)開銷節(jié)省響應(yīng)時(shí)間 | max=數(shù)字設(shè)置緩存元素的最大數(shù)量 inactive=時(shí)間設(shè)置超時(shí) 當(dāng)緩存溢出時(shí)使用LRU(最近最少使用)算法刪除緩存中的元素值骇;在這段時(shí)間內(nèi)緩存元素如果沒有被訪問將從緩存中刪除; <b> open_file_cache max=65536 inactive=60s </b> |
||
main | open_file_cache_valid | 設(shè)置檢查open_file_cache緩存的元素的時(shí)間間隔 | 80s | ||
main | open_file_cache_min_uses | 設(shè)置在由open_file_cache指令的inactive參數(shù)配置的超時(shí)時(shí)間內(nèi)文件應(yīng)該被訪問的最小次數(shù)莹菱。 如果訪問次數(shù)大于等于此值,文件描述符會(huì)保留在緩存中吱瘩,否則從緩存中刪除道伟。 |
1 | ||
main | error_log | 錯(cuò)誤的訪問請(qǐng)求日志記錄,當(dāng)并發(fā)很大時(shí)Nginx的訪問日志和錯(cuò)誤日志的保存肯定會(huì)造成對(duì)磁盤的大量讀寫也將影響Nginx的性能 | 注釋即可 或者 錯(cuò)誤日志設(shè)置為 error 或者 crit | ||
main-http | access_log | 成功的訪問請(qǐng)求日志記錄, 如必須保存日志,可以按每日或者每時(shí)或者其它時(shí)間段對(duì)日志做切割,這也可以減小IO蜜徽,雖然可能效果不是特別大祝懂,不過因?yàn)槿罩疚募叽缱冃×撕芏啵卜奖悴殚喕驓w檔分析日志 | 建議開啟日志記錄級(jí)別 main | ||
main-http | gzip | 默認(rèn)開啟了gzip壓縮功能:增加CPU的處理時(shí)間和負(fù)載(默認(rèn)即可) 關(guān)閉gzip壓縮功能:雖然減少了CPU計(jì)算節(jié)省了服務(wù)器的響應(yīng)時(shí)間拘鞋,但網(wǎng)站頁面總體響應(yīng)時(shí)間反而加長了靜態(tài)文件數(shù)據(jù)傳輸時(shí)間增加; |
設(shè)置 gzip on 即可;(該模塊中有附帶參數(shù)) | ||
main-http | keepalive_timeout | 空閑長連接保持打開狀態(tài)的時(shí)間;復(fù)用之前已建立的TCP連接接收請(qǐng)求砚蓬、發(fā)送回應(yīng),減少重新建立TCP連接的資源時(shí)間開銷 | 正數(shù)為開啟持久連接(常規(guī)設(shè)置120)而0關(guān)閉盆色。 當(dāng)網(wǎng)站頁面內(nèi)容以靜態(tài)為主時(shí)灰蛙,開啟持久連接; 動(dòng)態(tài)網(wǎng)頁且不能被轉(zhuǎn)化為靜態(tài)頁面,則關(guān)閉持久連接; |
||
main-http | keepalive_requests | 單個(gè)客戶端長連接可以請(qǐng)求的數(shù)量但是當(dāng)使用壓力測(cè)試工具從一個(gè)客戶端發(fā)送多個(gè)請(qǐng)求測(cè)試時(shí)隔躲,這個(gè)值設(shè)更高些特別有用 | 默認(rèn)值是100 | ||
main-http-server-location | expires | 瀏覽器緩存設(shè)置HTTP應(yīng)答中的“Expires”和“Cache-Control”頭標(biāo)摩梧。"Expires"一般結(jié)合"Last-Modified"使用比較緩存時(shí)間,避免了從服務(wù)器再次傳送文件內(nèi)容減小了服務(wù)器壓力,節(jié)省了帶寬同時(shí)也提高了用戶訪問速度 | -1 表示永遠(yuǎn)過期不緩存,推薦靜態(tài)文件如js/css等等訪問設(shè)置 expires 30d a; |
4.安全配置
描述:Nginx因?yàn)榘踩渲貌缓线m導(dǎo)致的安全問題,Nginx的默認(rèn)配置中存在一些安全問題,例如版本號(hào)信息泄露宣旱、未配置使用SSL協(xié)議等仅父。
對(duì)Nginx進(jìn)行安全配置可以有效的防范一些常見安全問題,按照基線標(biāo)準(zhǔn)做好安全配置能夠減少安全事件的發(fā)生,保證采用Nginx服務(wù)器系統(tǒng)應(yīng)用安全運(yùn)行;
Nginx安全配置項(xiàng):
0.隱藏nginx服務(wù)及其版本
溫馨提示: 在修改相應(yīng)的源代碼文件后需重新編譯浑吟。
#方式1:
#vi nginx-1.9.11/src/http/ngx_http_header_filter_module.c
static char ngx_http_server_string[] = "Server: LTWS" ; #修改處
#修改nginx_http_header_filter_module
#vi nginx-1.9.11/src/http/ngx_http_special_response.c
static u_char ngx_http_error_full_tail[] =
"<center> NGINX_VER </center>"
"<hr><center> http://www.weiyigeek.com</center>"
"</body>"
"</html>"
;
static u_char ngx_http_error_tail[] =
"<hr><center>LTWS</center>"
"</body>"
"</html>"
;
#設(shè)置響應(yīng)頭版本版本
#vim src/core/nginx.h
#define NGINX_VERSION "secWaf" #可以改成你要的版本號(hào)
#define NGINX_VER "1.1" NGINX_VERSION #改成你的服務(wù)名稱
設(shè)置成功后驗(yàn)證:
1.低權(quán)限用戶運(yùn)行服務(wù)
應(yīng)配置非root低權(quán)限用戶來運(yùn)行nginx服務(wù),設(shè)置如下建立Nginx用戶組和用戶笙纤,采用user指令指運(yùn)行用戶
加固方法:
groupadd nginxweb;
useradd -M -g nginxweb -s /sbin/nologin nginxweb
#nginx.conf 中配置 或者編譯 的時(shí)候指定
#nginx 安裝編譯參數(shù)--user=nginx --group=nginx
user nginxweb
2.配置SSL及其會(huì)話復(fù)用
我們應(yīng)該為提供的站點(diǎn)配置Secure Sockets Layer Protocol (SSL協(xié)議),配置其是為了數(shù)據(jù)傳輸?shù)陌踩蛑茫琒SL依靠證書來驗(yàn)證服務(wù)器的身份粪糙,并為瀏覽器和服務(wù)器之間的通信加密。
server {
# 開啟 SSL 與 http2 支持
listen 443 ssl http2;
listen [::]:443 ssl http2;
# 開啟 SSL 忿项,如果想http 與 https 公用一個(gè)配置則可以將其注釋( the "ssl" directive is deprecated )
# ssl on;
# 配置證書鏈與證書密鑰
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/weiyigeek.top.key;
# ssl會(huì)話復(fù)用超時(shí)時(shí)間以及會(huì)話復(fù)用緩存大小
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
......
}
3.限制SSL協(xié)議與加密套件
不應(yīng)使用不安全SSLv2蓉冈、SSLv3協(xié)議即以下和存在脆弱性的加密套件(ciphers), 我們應(yīng)該使用較新的TLS協(xié)議也應(yīng)該優(yōu)于舊的,并使用安全的加密套件。
# 兼容性較為通用的SSL協(xié)議與加密算法套件
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;
# 瀏覽器客戶端自動(dòng)協(xié)商加密套件(為了兼容性)
ssl_prefer_server_ciphers on;
4.攔截垃圾信息
HTTP Referrer Spam是垃圾信息發(fā)送者用來提高他們正在嘗試推廣的網(wǎng)站的互聯(lián)網(wǎng)搜索引擎排名一種技術(shù)轩触,如果他們的垃圾信息鏈接顯示在訪問日志中寞酿,并且這些日志被搜索引擎掃描,則會(huì)對(duì)網(wǎng)站排名產(chǎn)生不利影響
加固方法:
if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) ){
return 403;
}
5.惡意掃描攔截
當(dāng)惡意攻擊者采用掃描器進(jìn)行掃描時(shí)候利用use-agent判斷是否是常用的工具掃描以及特定的版本,是則返回錯(cuò)誤或者重定向;
# 封殺各種user-agent
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan|nessus|wvs" ) {
return 403;
}
if ($http_user_agent ~* "" ) {
return 403;
}
# 封殺特定的文件擴(kuò)展名比如.bak以及目錄;
location ~* \.(bak|swp|save|sh|sql|mdb|svn|git|old)$ {
rewrite ^/(.*)$ $host permanent;
}
location /(admin|phpadmin|status) { deny all; }
6.禁用WebDAV
Nginx支持webdav脱柱,雖然默認(rèn)情況下不會(huì)編譯伐弹。如果使用webdav,則應(yīng)該在Nginx策略中禁用此規(guī)則榨为。
加固方法: dav_methods 應(yīng)設(shè)置為off
7.禁用Nginx狀態(tài)模塊
當(dāng)訪問一個(gè)特制的URL時(shí)惨好,如"../nginx.status",stub_status模塊提供一個(gè)簡短的Nginx服務(wù)器狀態(tài)摘要,大多數(shù)情況下不應(yīng)啟用此模塊随闺。
加固方法:nginx.conf文件中stub_status不應(yīng)設(shè)置為:on
8.關(guān)閉默認(rèn)錯(cuò)誤頁上的Nginx版本號(hào)
如果在瀏覽器中出現(xiàn)Nginx自動(dòng)生成的錯(cuò)誤消息日川,默認(rèn)情況下會(huì)包含Nginx的版本號(hào),這些信息可以被攻擊者用來幫助他們發(fā)現(xiàn)服務(wù)器的潛在漏洞
加固方法: 關(guān)閉"Server"響應(yīng)頭中輸出的Nginx版本號(hào)將server_tokens應(yīng)設(shè)置為:off
server_tokens off
9.設(shè)置client_body_timeout超時(shí)
client_body_timeout設(shè)置請(qǐng)求體(request body)的讀超時(shí)時(shí)間。僅當(dāng)在一次readstep中矩乐,沒有得到請(qǐng)求體龄句,就會(huì)設(shè)為超時(shí)回论。超時(shí)后Nginx返回HTTP狀態(tài)碼408(Request timed out)。
加固方法:nginx.conf文件中client_body_timeout應(yīng)設(shè)置為:10
10.設(shè)置client_header_timeout
client_header_timeout設(shè)置等待client發(fā)送一個(gè)請(qǐng)求頭的超時(shí)時(shí)間(例如:GET / HTTP/1.1)分歇。僅當(dāng)在一次read中沒有收到請(qǐng)求頭傀蓉,才會(huì)設(shè)為超時(shí)。超時(shí)后Nginx返回HTTP狀態(tài)碼408(Request timed out)职抡。
加固方法:nginx.conf文件中client_header_timeout應(yīng)設(shè)置為:10
11.設(shè)置keepalive_timeout超時(shí)
keepalive_timeout設(shè)置與client的keep-alive連接超時(shí)時(shí)間葬燎。服務(wù)器將會(huì)在這個(gè)時(shí)間后關(guān)閉連接。
加固方法:nginx.conf文件中keepalive_timeout應(yīng)設(shè)置為:55
12.設(shè)置send_timeout超時(shí)
send_timeout設(shè)置客戶端的響應(yīng)超時(shí)時(shí)間繁调。這個(gè)設(shè)置不會(huì)用于整個(gè)轉(zhuǎn)發(fā)器萨蚕,而是在兩次客戶端讀取操作之間。如果在這段時(shí)間內(nèi)蹄胰,客戶端沒有讀取任何數(shù)據(jù)岳遥,Nginx就會(huì)關(guān)閉連接。
加固方法:nginx.conf文件中send_timeout應(yīng)設(shè)置為:10
13.Nginx可用的方法應(yīng)限制為GET, HEAD, POST
GET和POST是Internet上最常用的方法裕寨。Web服務(wù)器方法在RFC 2616中定義禁用不需要實(shí)現(xiàn)的可用方法浩蓉。
加固方法:
#nginx.conf文件中應(yīng)存在
if ($request_method !~ ^(GET|HEAD|POST)$ )
14.控制并發(fā)連接limit_zone slimits
limit_zone 配置項(xiàng)限制來自客戶端的同時(shí)連接數(shù)。通過此模塊可以從一個(gè)地址限制分配會(huì)話的同時(shí)連接數(shù)量或特殊情況宾袜。
加固方法:nginx.conf文件中l(wèi)imit_zone應(yīng)設(shè)置為:slimits $binary_remote_addr 5m
# 設(shè)定保存各個(gè)鍵(例如$binary_remote_addr)狀態(tài)的共享內(nèi)存空間的參數(shù)捻艳,zone=空間名字:大小大小的計(jì)算與變量有關(guān)
limit_conn_zone $binary_remote_addr zone=ops:10m;
15.控制并發(fā)連接limit_conn slimits
該配置項(xiàng)控制一個(gè)會(huì)話同時(shí)連接的最大數(shù)量,即限制來自單個(gè)IP地址的連接數(shù)量庆猫。
加固方法:nginx.conf 文件中 limit_conn 應(yīng)設(shè)置為: slimits 5
# 表示同一IP同一時(shí)間只允許10個(gè)連接
limit_conn ops 5;
16.主機(jī)防webshell跨目錄瀏覽以及列目錄
加固方法:
a.在nginx.conf里把每個(gè)虛擬主機(jī)站點(diǎn)請(qǐng)求端口給區(qū)別開
b.為每個(gè)站點(diǎn)建一個(gè)conf认轨,并進(jìn)行配置
c.修改php-fpm啟動(dòng)腳本
d.啟動(dòng)服務(wù)
#在main-http-server段中設(shè)置開啟或者關(guān)閉(對(duì)于需要列目錄的則開啟,否則默認(rèn)是關(guān)閉的)
autoindex off
17.文件名解析漏洞php_info,加入fcgi.conf即可
if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 403;
}
18.訪問權(quán)限控制nginx
加固方法:
#nginx.conf
location ~ ^/script/ {
auth_basic "welcome to weiyigeek.github.io";
auth_basic_user_file /var/www/test/script/.htpasswd;
}
#建立htpasswd密碼進(jìn)行認(rèn)證
mkdir /var/www/test/script
perl -e "print crypt('baidu.eud',"n");"
nnUygd3RSf3u6
echo 'nginx:nnUygd3RSf3u6' > /var/www/test/script/.htpasswd
/usr/local/nginx/sbin/nginx -s reload
19.異常狀態(tài)返回200隱藏URL
解決辦法:
server{
listen 80;
server_name weiyigeek.top;
index index.html index.htm index.php;
root /data/web;
error_page 404 =200 /404.jpg;
}
20.安全模塊的選擇
# 安全檢測(cè)模塊選擇
http_sub_module
http_stub_status_module
xss-nginx-module
with-http_ssl_module
21.記錄訪問者真實(shí)IP
描述后端獲取Proxy后的真實(shí)Client的IP獲取需要安裝--with-http_realip_module
,然后后端程序采用JAVA(request.getAttribute("X-Real-IP")
)進(jìn)行獲取;
set_real_ip_from 100.0.0.0/8;#(這里是已知的代理ip)
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# 代理轉(zhuǎn)發(fā)
location / {
proxy_pass http://weiyigeek.top
}
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set $Real $http_x_forwarded_for;
if ( $Real ~ (\d+)\.(\d+)\.(\d+)\.(\d+),(.*) ){
set $Real $1.$2.$3.$4;
}
proxy_set_header X-Real-IP $remote_addr;
#區(qū)別
$proxy_add_x_forwarded_for #較下面多一個(gè)$remote_addr的(只能獲取到與服務(wù)器本身直連的上層請(qǐng)求ip)
$http_x_forwarded_for
#日志獲取
$http_x_real_ip|$remote_addr #前提條件是cdn 那邊也設(shè)置了X-forward否則獲取的是cdn的ip
22.地區(qū)訪問響應(yīng)措施
描述: 如果要使用geoip地區(qū)選擇,我們需要再nginx編譯時(shí)加入 --with-http_geoip_module
編譯參數(shù)月培。
# 例如,訪問者IP地址不為中國或者美國的都返回403嘁字。
if ( $geoip_country_code !~ ^(CN|US)$ ) {
return 403;
}
23.資源防盜鏈設(shè)置
描述: 為了防止外部站點(diǎn)引用我們的靜態(tài)資源,我們需要設(shè)置那些域名可以訪問我們的靜態(tài)資源杉畜。
# none : "Referer" 來源頭部為空的情況
# blocked : "Referer" 來源頭部不為空
# server_names : "Referer"來源頭部包含當(dāng)前的server_names(當(dāng)前域名)
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked weiyigeek.top server_names ~\.google\. ~\.baidu\.; #這是可以盜鏈的域名或IP地址纪蜒,一般情況可以把google,baidu此叠,sogou纯续,soso,bing灭袁,feedsky猬错,zhuaxia,photozero等域名放進(jìn)來
if ($invalid_referer) {
#這樣設(shè)置能夠防盜鏈茸歧,不斷地302重定向很多次兔魂,可能會(huì)加重服務(wù)器的負(fù)擔(dān),所以不建議這么做举娩,除非有單獨(dú)的圖片服務(wù)器支持
return 403; # 或者返回 403 錯(cuò)誤代碼 或者 JSON 字符串
# 返回json
add_header Content-Type 'application/json; charset=utf-8';
return 200 "{'msg':'valid'}";
# 本地目錄重寫
rewrite ^/.*.(gif|jpg|jpeg|png)$ /static/qrcode.jpg last;
# 重寫遠(yuǎn)程URL
rewrite ^/ https://www.weiyigeek.top/picture/images/details-image-1.jpg;
}
}
24.常規(guī)安全響應(yīng)頭配置
描述: 下面收集了Web服務(wù)中常規(guī)的安全響應(yīng)頭, 它可以保證不受到某些攻擊,建議在指定的 server{}
代碼塊進(jìn)行配置。
# HSTS (ngx_http_headers_module is required) 應(yīng)該只使用 HTTPS 而不是使用 HTTP 通信
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;
# XXS-Protection
add_header X-XSS-Protection "1; mode=block";
# MIME 模擬探測(cè)
add_header X-Content-Type-Options nosniff;
# Frame 安全控制
add_header X-Frame-Options ALLOW-FROM music.163.com;
# Spider Robots 爬取策略限制
add_header X-Robots-Tag none;
# CORS 跨域設(shè)置
add_header Access-Control-Allow-Origin '*.weiyigeek.top';
add_header Access-Control-Allow-Methods 'GET';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
# CSP
# 現(xiàn)在讓我們?cè)试S自托管 scripts、images铜涉、CSS智玻、fonts 和 AJAX,以及 jQuery CDN 托管腳本和 Google Analytics 的內(nèi)容:
Content-Security-Policy: default-src 'none'; script-src 'self' https://code.jquery.com https://www.google-analytics.com; img-src 'self' https://www.google-analytics.com; connect-src 'self'; font-src 'self'; style-src 'self';
25.防止非所屬域名解析到服務(wù)器
描述: 為了防止某些未備案的域名或者惡意鏡像站域名綁定到我們服務(wù)器上, 導(dǎo)致服務(wù)器被警告關(guān)停芙代,將會(huì)對(duì)業(yè)務(wù)或者SEO排名以及企業(yè)形象造成影響吊奢,我們可以通過如下方式進(jìn)行防范。
server {
listen 80 default_server;
server_name 82.156.18.253;
# 禁止搜索引擎收錄IP
add_header X-Robots-Tag 'noindex,noarchive,nosnippet';
location ^~ / {
# IP地址訪問強(qiáng)制301跳轉(zhuǎn)
if ( $host = 82.156.18.253 ){
return 301 https://www.weiyigeek.top/index.html;
}
# 請(qǐng)求host非指定域名時(shí)返回json
if ( $host !~* weiyigeek\.top ) {
add_header Content-Type 'application/json; charset=utf-8';
return 200 '{"status":"error","Author":"WeiyiGeek","Site":"https://www.weiyigeek.top","Chinese":"大佬, 請(qǐng)不要把你的域名解析到我的服務(wù)器上","English":"Friend, Please do not resolve your domain name to my server"}';
# return 301 https://space.bilibili.com/385802642;
}
}
...
}
執(zhí)行結(jié)果:
$ curl -I 82.156.18.253
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 11 Apr 2022 12:15:02 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://www.weiyigeek.top/index.html
X-Robots-Tag: noindex,noarchive,nosnippet
$ curl --insecure -I https://82.156.18.253
HTTP/2 301
server: nginx
date: Mon, 11 Apr 2022 12:15:24 GMT
content-type: text/html
content-length: 162
location: https://www.weiyigeek.top/index.html
x-robots-tag: noindex,noarchive,nosnippet
$ curl weiyigeek.cn
{"status":"error","Author":"WeiyiGeek","Site":"https://www.weiyigeek.top","Chinese":"大佬, 請(qǐng)不要把你的域名解析到我的服務(wù)器上","English":"Friend, Please do not resolve your domain name to my server"}
25.限制指定客戶端地址訪問
描述: 有時(shí)你的網(wǎng)站可能只需要被某一IP或者IP段的地址請(qǐng)求訪問纹烹,那么非白名單中的地址訪問將被阻止訪問, 我們可以如下配置;
location / {
allow 12.97.167.194;
allow 12.33.1.2;
allow 12.152.49.4;
deny all;
}
5.配置說明
常用nginx配置文件解釋:
#[Main] Nginx啟動(dòng)的用戶(建議非root用戶)
user nginx;
#[Main] NGINX工作進(jìn)程數(shù)設(shè)置值和CPU核心數(shù)一致(優(yōu)化選項(xiàng))
#采用 grep ^processor /proc/cpuinfo | wc -l 進(jìn)行查看或者auto
worker_processes auto;
#[Main] 工作模式與連接數(shù)上限即每個(gè)工作進(jìn)程可以處理并發(fā)的最大連接數(shù)(優(yōu)化選項(xiàng))
events {
#[Main-events] nginx作為反向代理服務(wù)器單個(gè)進(jìn)程最大連接數(shù)(最大連接數(shù)=連接數(shù)*進(jìn)程數(shù))
#建議與worker_rlimit_nofile一致
worker_connections 65535;
#[Main-events] use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
#epoll模型是Linux 2.6以上版本內(nèi)核中的高性能網(wǎng)絡(luò)I/O模型页滚,如果跑在FreeBSD上面,就用kqueue模型铺呵。
use epoll;
#[Main-events] 提高性能和吞吐量
accept_mutex off;
}
#[Main] 高并發(fā)參數(shù)(通過設(shè)置cpu粘性來降低由于多CPU核切換造成的寄存器等現(xiàn)場(chǎng)重建帶來的性能損耗)(優(yōu)化選項(xiàng))
worker_cpu_affinity 0001 0010 0100 1000; #四核的時(shí)候
#假如是8 cpu 分配如下: worker_cpu_affinity 00000001 00000010 00000100 00001000 0001000000100000 01000000 10000000
#[Main] 默認(rèn)是沒有設(shè)置裹驰,可以限制為操作系統(tǒng)最大的限制65535。(優(yōu)化選項(xiàng))
worker_rlimit_nofile 65535
#[Main]日志位置和日志級(jí)別[ debug | info | notice | warn | error | crit ]
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
error_log logs/error.log error;
#服務(wù)進(jìn)程啟動(dòng)文件
pid /var/run/nginx.pid;
#當(dāng)前主配置文件包含其他的nginx模塊配置文件
include /etc/nginx/conf.d/*.conf;
#[Main部分] http服務(wù)器提供http服務(wù)相關(guān)的一些配置參數(shù)片挂。例如:是否使用keepalive啊幻林,是否使用gzip進(jìn)行壓縮等。
http {
#文件擴(kuò)展名與文件類型映射表
include mime.types;
#默認(rèn)文件類型
default_type text/html;
#響應(yīng)的編碼格式
charset UTF-8;
#服務(wù)器名字的hash表大小
server_names_hash_bucket_size 128;
#緩沖區(qū)代理緩沖用戶端請(qǐng)求的最大字節(jié)數(shù)音念,
client_body_buffer_size 128k
#上傳文件大小限制
client_header_buffer_size 4k;
#允許客戶端請(qǐng)求的最大單文件字節(jié)數(shù)沪饺。如果有上傳較大文件,請(qǐng)?jiān)O(shè)置它的限制值
client_max_body_size 10m
#文件訪問緩存設(shè)置與系統(tǒng)文件描述符設(shè)置一致
open_file_cache max=65536 inactive=60s;
open_file_cache_valid 80s;
open_file_cache_min_uses 1;
large_client_header_buffers 4 64k; #設(shè)定請(qǐng)求緩
#nginx日志記錄格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#使用緩沖而不是每條日志記錄都單獨(dú)執(zhí)行寫操作闷愤,NGINX會(huì)緩沖一連串的日志記錄使用單個(gè)操作把它們一起寫到文件中整葡。
access_log logs/access.log main buffer=1024 flush=60s;
#關(guān)閉server信息頭響應(yīng)
server_tokens off;
#[MAIN-http]開啟高效文件傳輸模式,指定nginx是否調(diào)用sendfile函數(shù)來輸出文件,減少用戶空間到內(nèi)核空間的上下文切換(與accept_mutex關(guān)聯(lián)配置)
#對(duì)于普通應(yīng)用設(shè)為 on讥脐,如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用可設(shè)置為off遭居,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的負(fù)載攘烛。
#系統(tǒng)調(diào)用可以實(shí)現(xiàn)從一個(gè)文件描述符到另一個(gè)文件描述符的數(shù)據(jù)拷貝魏滚,通常實(shí)現(xiàn)零拷貝,這能加速TCP數(shù)據(jù)傳輸
#當(dāng)配置環(huán)境下有sendfile指令和激活內(nèi)容更改過濾器的指令時(shí)NGINX會(huì)自動(dòng)禁用sendfile坟漱。#(優(yōu)化選項(xiàng))
sendfile on;
#防止網(wǎng)絡(luò)阻塞,不過要包涵在keepalived參數(shù)才有效
tcp_nopush on;
tcp_nodelay on;
#空閑長連接保持打開狀態(tài)的時(shí)間(優(yōu)化選項(xiàng))
#長連接請(qǐng)求大量小文件的時(shí)候鼠次,可以減少重建連接的開銷,但假如有大文件上傳120s內(nèi)沒上傳完成會(huì)導(dǎo)致失敗芋齿。如果設(shè)置時(shí)間過長腥寇,用戶又多,長時(shí)間保持連接會(huì)占用大量資源觅捆。
keepalive_timeout 120;
#用于指定響應(yīng)客戶端的超時(shí)時(shí)間赦役。這個(gè)超時(shí)僅限于兩個(gè)連接活動(dòng)之間的時(shí)間,如果超過這個(gè)時(shí)間客戶端沒有任何活動(dòng)栅炒,Nginx將會(huì)關(guān)閉連接
#send_timeout 180s
###模塊http_gzip#####
#開啟gzip壓縮輸出掂摔,減少網(wǎng)絡(luò)傳輸术羔。
gzip on;
#最小壓縮文件大小(注意不能小于1k)
gzip_min_length 1k;
#壓縮緩沖區(qū)
gzip_buffers 4 64k;
#壓縮版本(默認(rèn)1.1,前端如果是squid2.5請(qǐng)使用1.0)
gzip_http_version 1.1;
#壓縮等級(jí)
gzip_comp_level 2;
##壓縮類型乙漓,默認(rèn)就已經(jīng)包含text/html级历,
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
###模塊fastcgi#####
#FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用,提高訪問速度叭披。
# fastcgi_temp_path /tmp/fastcgi_temp;
# fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m inactive=30m max_size=1g;
# fastcgi_cache_key $host$request_uri;
#指定的Http狀態(tài)碼指定緩存時(shí)間
# fastcgi_cache_valid 200 302 1h;
# fastcgi_cache_valid 301 1d;
# fastcgi_cache_valid any 1m;
# fastcgi_cache_min_uses 1;
# fastcgi_cache_use_stale error timeout http_500 http_503 invalid_header;
#指定鏈接到后端FastCGI的超時(shí)時(shí)間寥殖。
# fastcgi_connect_timeout 300;
#向FastCGI傳送請(qǐng)求的超時(shí)時(shí)間,這個(gè)值是指已經(jīng)完成兩次握手后向FastCGI傳送請(qǐng)求的超時(shí)時(shí)間涩蜘。
# fastcgi_send_timeout 300;
#指定接收FastCGI應(yīng)答的超時(shí)時(shí)間嚼贡,這個(gè)值是指已經(jīng)完成兩次握手后接收FastCGI應(yīng)答的超時(shí)時(shí)間。
# fastcgi_read_timeout 300;
#指定讀取FastCGI應(yīng)答第一部分需要用多大的緩沖區(qū)同诫,這個(gè)值表示將使用1個(gè)64KB的緩沖區(qū)讀取應(yīng)答的第一部分(應(yīng)答頭)粤策,可以設(shè)置為gastcgi_buffers選項(xiàng)指定的緩沖區(qū)大小。
# fastcgi_buffer_size 64k;
#一個(gè)php腳本所產(chǎn)生的頁面大小為256KB剩辟,那么會(huì)分配4個(gè)64KB的緩沖區(qū)來緩存
# fastcgi_buffers 4 64k;
#建議設(shè)置為fastcgi_buffer的兩倍掐场,繁忙時(shí)候的buffer
# fastcgi_busy_buffers_size 128k;
# fastcgi_temp_file_write_size 128k;
#[Main-http]配置虛擬主機(jī)設(shè)置
#http服務(wù)上支持若干虛擬主機(jī)。每個(gè)虛擬主機(jī)一個(gè)對(duì)應(yīng)的server配置項(xiàng)贩猎,配置項(xiàng)里面包含該虛擬主機(jī)相關(guān)的配置
server {
#[Main-http-server] ngnix監(jiān)聽端口
listen 80;
#服務(wù)器名:虛擬主機(jī)的域名可以寫多個(gè)域名熊户,可以通過正則匹配。
server_name localhost;
#實(shí)現(xiàn)訪問http時(shí)自動(dòng)跳轉(zhuǎn)到https
return 301 https://$host$request_uri;
#access_log logs/host.access.log main;
#請(qǐng)求正則匹配的來判斷訪問路徑吭服,默認(rèn)訪問localhost:80 訪問的是下面這個(gè)路徑的網(wǎng)頁
location / {
#站點(diǎn)根目錄你網(wǎng)站文件存放的地方
root html;
#定義路徑下默認(rèn)訪問的文件名嚷堡,一般跟著root放
index index.html index.htm;
#開啟限制IP連接數(shù)的時(shí)候需要使用
#limit_zone crawler $binary_remote_addr 10m;
#訪問控制模塊默認(rèn)就會(huì)安裝,而且寫法也非常簡單艇棕,可以分別有多個(gè)allow,deny蝌戒,允許或禁止某個(gè)ip或ip段訪問,
#依次滿足任何一個(gè)規(guī)則就停止往下匹配 (安全選項(xiàng))
allow 192.168.10.100;
allow 172.29.73.0/24;
deny all;
#認(rèn)證訪問 通過httpd-devel 工具的 htpasswd 來為訪問的路徑設(shè)置登錄密碼 (安全選項(xiàng))
#比如:htpasswd -c nginx.htpasswd admin 生成了默認(rèn)使用CRYPT加密的密碼文件#
auth_basic "Nginx Status"
auth_basic_user_file /usr/local/nginx/nginx.passwd
#列出目錄 autoindex Nginx默認(rèn)是不允許列出整個(gè)目錄的合適下載服務(wù)器沼琉。(非常不推薦)
#如需此功能北苟,打開nginx.conf文件,在location打瘪,server 或 http段中加入autoindex on;
#autoindex on
#顯示出文件的確切大小單位是bytes友鼻。改為off后顯示出文件的大概大小,單位是kB或者M(jìn)B或者GB
#autoindex_exact_size off
#默認(rèn)為off闺骚,顯示的文件時(shí)間為GMT時(shí)間彩扔。改為on后,顯示的文件時(shí)間為文件的服務(wù)器時(shí)間
#autoindex_localtime on;
}
#error_page 404 /404.html;
#將服務(wù)器錯(cuò)誤頁面直接指向靜態(tài)頁面/50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#代理PHP腳本到Apache上監(jiān)聽127.0.0.1:80 末尾以php或者php5結(jié)尾的
#location ~ \.(php|php5)?$ {
# proxy_pass http://127.0.0.1;
#}
#將PHP腳本傳遞到正在監(jiān)聽127.0.0.1:9000的FastCGI服務(wù)器
#location ~ .+\.(php|php5)$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_pass unix:/tmp/php.sock; #為了安全推薦方式
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
# fastcgi_cache cache_fastcgi;
#}
# 如果Apache的文檔根目錄與nginx的根目錄一致僻爽,則拒絕訪問.htaccess文件
#location ~ /\.ht {
# deny all;
#}
#靜態(tài)資源正則請(qǐng)求路徑匹配
location ~ .+\.(gif|jpg|jpeg|png|bmp|swf|txt|csv|doc|docx|xls|xlsx|ppt|pptx|flv)$ {
root e:wwwroot;
expires 30d; #緩存有效期30天
access_log off; #訪問記錄
}
#JS和CSS緩存時(shí)間設(shè)置
location ~ .+\.(js|css|html|xml)$ { expires 30d;}
#訪問控制也可以加入認(rèn)證
location /nginx-status{
#nginx中的stub_status模塊主要用于查看Nginx的一些狀態(tài)信息. 本模塊默認(rèn)沒有安裝需要編譯安裝虫碉。
stub_status on;
allow 192.168.1.0/24;
allow 127.0.0.1;
deny all;
}
}
#### Nginx反向代理 ######
#[Main-http] upstream模塊設(shè)置反向代理和負(fù)載均衡的連接的內(nèi)部web應(yīng)用服務(wù)IP端口
upstream monitor_server {
#seesion記錄訪問的主機(jī),比如第一次訪問該服務(wù)器后就記錄胸梆,之后再訪問都是該服務(wù)器了-進(jìn)行了綁定
ip_hash;
#內(nèi)網(wǎng)的應(yīng)用服務(wù),weigth參數(shù)表示權(quán)值越高被分配到的幾率越大敦捧。
#max_fails當(dāng)有max_fails個(gè)請(qǐng)求失敗须板,就表示后端的服務(wù)器不可用,默認(rèn)為1將其設(shè)置為0可以關(guān)閉檢查
#fail_timeout 在以后的fail_timeout時(shí)間內(nèi)nginx不會(huì)再把請(qǐng)求發(fā)往已檢查出標(biāo)記為不可用的服務(wù)器
server 192.168.0.131:80 weight=9 max_fails=5 fail_timeout=600s;
server 192.168.0.132:80 weight=1 max_fails=5 fail_timeout=600s;
}
#server指令配置項(xiàng)
server {
listen 80;
#請(qǐng)求響應(yīng)的域名
server_name blog.weiyigeek.top;
location / {
##### 模塊http_proxy:##### 反向代理主要配置
#即反向代理兢卵,對(duì)應(yīng)upstream負(fù)載均衡器
proxy_pass http://monitor_server;
#代理服務(wù)器相關(guān)信息頭設(shè)置
proxy_redirect off;
#如果是有涉及redirect的服務(wù)逼纸,一定要加上端口8081,否 則默認(rèn)tomcat在redirect時(shí)候默認(rèn)找80端口
proxy_set_header Host $host;
#轉(zhuǎn)發(fā)請(qǐng)求的原IP地址济蝉,程序中通過request.getHeader("Proxy-Client-IP")獲得ip
proxy_set_header X-Real-IP $remote_addr;
#端的Web服務(wù)器可以通過X-Forwarded-For獲取用戶真實(shí)IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
##nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
#模塊http_proxy代理超時(shí)設(shè)置
proxy_connect_timeout 60s;
##nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
proxy_read_timeout 60s;
#后端服務(wù)器數(shù)據(jù)回傳時(shí)間(代理發(fā)送超時(shí)) 間
proxy_send_timeout 30s;
#設(shè)置代理服務(wù)器(nginx)從后端realserver讀取并保存用戶頭信息的緩沖區(qū)大小,默認(rèn)與proxy_buffers大小相同菠发,其實(shí)可以將這個(gè)指令值設(shè)的小一點(diǎn)
proxy_buffer_size 4k
#proxy_buffers緩沖區(qū)王滤,nginx針對(duì)單個(gè)連接緩存來自后端realserver的響應(yīng),網(wǎng)頁平均在32k以下的
proxy_buffers 4 32k
#高負(fù)荷下緩沖大凶茵(proxy_buffers*2)
proxy_busy_buffers_size 64k
#當(dāng)proxy_buffers放不下后端服務(wù)器的響應(yīng)內(nèi)容時(shí)雁乡,會(huì)將一部分保存到硬盤的臨時(shí)文件中,這個(gè)值用來設(shè)置最大臨時(shí)文件大小糜俗,默認(rèn)1024M
#它與proxy_cache沒有關(guān)系踱稍。大于這個(gè)值,將從upstream服務(wù)器傳回悠抹。設(shè)置為0禁用珠月。
proxy_max_temp_file_size 0
#當(dāng)緩存被代理的服務(wù)器響應(yīng)到臨時(shí)文件時(shí),限制每次寫臨時(shí)文件的大小楔敌。proxy_temp_path(可以在編譯的時(shí)候)指定寫到哪那個(gè)目錄啤挎。
proxy_temp_file_write_size 64k
#把cookie的作用域替換成我們的域名。
#proxy_cookie_domain google.com.hk www.example.com;
#proxy_set_header Host "www.google.com.hk"; #設(shè)置反向代理得header請(qǐng)求頭
#proxy_redirect http://www.google.com.hk/ ; #重定向
#proxy_redirect http:// https://;
#sub_filter www.google.com.hk www.example.com; #把谷歌的域名替換成自己的卵凑,注意需要安裝nginx的sub_filter模塊
#反向代理的配置. END
}
#本地動(dòng)靜分離反向代理配置
#所有jsp的頁面均交由tomcat或resin處理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
#所有靜態(tài)文件由nginx直接讀取不經(jīng)過tomcat或resin
location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 15d; }
location ~ \.(js|css)$ { expires 1h; }
}
# 另一個(gè)虛擬主機(jī)庆聘,混合使用IP、名稱和基于端口的配置
server {
listen 80;
listen [::]:80;
server_name weiyigeek.top;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name weiyigeek.top;
# HSTS (ngx_http_headers_module is required) 應(yīng)該只使用 HTTPS 而不是使用 HTTP 通信
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;
# XXS-Protection
add_header X-XSS-Protection "1; mode=block";
# MIME 模擬探測(cè)
add_header X-Content-Type-Options nosniff;
# Frame 安全控制
add_header X-Frame-Options ALLOW-FROM music.163.com;
# Spider Robots 爬取策略限制
# add_header X-Robots-Tag none; # 不限制
# add_header X-Robots-Tag noindex, noarchive, nosnippet; # 限制
# 開啟 SSL 勺卢,如果想http 與 https 公用一個(gè)配置則可以將其注釋( the "ssl" directive is deprecated )
# ssl on;
# 配置證書鏈與證書密鑰
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/weiyigeek.top.key;
# ssl會(huì)話復(fù)用超時(shí)時(shí)間以及會(huì)話復(fù)用緩存大小
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
# 配置雙證書時(shí)開啟否則應(yīng)該關(guān)閉
ssl_session_tickets off;
## OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
# 使用根 CA 和中間證書驗(yàn)證 OCSP 響應(yīng)的信任鏈
ssl_trusted_certificate /etc/nginx/ssl/ca.cer;
# 僅使用ECDH是不用配置ssl_dhparam的否則你應(yīng)該為它配置上
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam /path/to/dhparam;
# 兼容性較為通用的SSL協(xié)議與加密算法套件
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;
# 安全配置: ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
# 證書常規(guī)握手加密算法方式共十八個(gè)伙判,ECDHE、DHE黑忱、AES開頭分別6個(gè)
; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DES:!MD5:!RC4;
# 為了兼容性推薦服務(wù)器自動(dòng)選擇要使用的算法套件
ssl_prefer_server_ciphers on;
# replace with the IP address of your resolver
resolver 223.6.6.6 8.8.8.8 192.168.12.254;
}
}
6.補(bǔ)充知識(shí)
(1) 阿里巴巴提供的Concat或者Google的PageSpeed模塊實(shí)現(xiàn)這個(gè)合并文件的功能宴抚。
- Concat源代碼網(wǎng)址:https://github.com/alibaba/nginx-http-concat/
- PageSpeed源代碼網(wǎng)址:https://github.com/pagespeed/ngx_pagespeed。
(2) PHP-FPM的優(yōu)化
如果您高負(fù)載網(wǎng)站使用PHP-FPM管理FastCGI對(duì)于PHP-FPM的優(yōu)化非常重要
- 1.增加FastCGI進(jìn)程數(shù):把PHP FastCGI子進(jìn)程數(shù)調(diào)到100或以上,在4G內(nèi)存的服務(wù)器上200就可以建議通過壓力測(cè)試獲取最佳值杨何。
- 2.增加 PHP-FPM打開文件描述符的限制
# vi /path/to/php-fpm.conf
找到“1024”,把1024更改為 4096 或者更高,之后重啟 PHP-FPM
# /etc/security/limits.conf
* hard nofile 65536
* soft nofile 65536
- 3.適當(dāng)增加max_requests: 標(biāo)簽max_requests指明了每個(gè)children最多處理多少個(gè)請(qǐng)求后便會(huì)被關(guān)閉默認(rèn)的設(shè)置是500酱塔。
(3) 配置Resin on Linux或者Windows為我們可以打開 resin-3.1.9/bin/httpd.sh
在不影響其他代碼的地方加入:-Dhttps.protocols=TLSv1.2, 例如
exec $JAVA_EXE -jar -Dhttps.protocols=TLSv1.2 ${RESIN_HOME}/lib/resin.jar $*
#exec $JAVA_EXE -jar ${RESIN_HOME}/lib/resin.jar $*
原文地址: https://blog.weiyigeek.top/2019/9-2-122.html
文章書寫不易,如果您覺得這篇文章還不錯(cuò)的危虱,請(qǐng)給這篇專欄 【點(diǎn)個(gè)贊羊娃、投個(gè)幣、收個(gè)藏埃跷、關(guān)個(gè)注蕊玷,轉(zhuǎn)個(gè)發(fā)】(人間五大情)邮利,這將對(duì)我的肯定,謝謝垃帅!延届。
本文章來源 我的Blog站點(diǎn) 或 WeiyiGeek 公眾賬號(hào) 以及 我的BiliBili專欄 (
技術(shù)交流、友鏈交換請(qǐng)郵我喲
),謝謝支持贸诚!(?′?‵?) ?
歡迎各位志同道合的朋友一起學(xué)習(xí)交流方庭,如文章有誤請(qǐng)留下您寶貴的知識(shí)建議,通過郵箱【master#weiyigeek.top】聯(lián)系我喲酱固!