安全開發(fā)運(yùn)維必備,如何進(jìn)行Nginx代理Web服務(wù)器性能優(yōu)化與安全加固配置撒蟀,看這篇指南就夠了

本章目錄

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.引言

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ì)象
  1. 項(xiàng)目經(jīng)理
  2. 開發(fā)人員
  3. 測(cè)試人員
  4. 運(yùn)維人員
  5. 相關(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
WeiyiGeek.

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 30da;


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ù)名稱
WeiyiGeek.修改服務(wù)名及其版本對(duì)應(yīng)文件

設(shè)置成功后驗(yàn)證:


WeiyiGeek.驗(yàn)證服務(wù)名及其版本修改


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; }
WeiyiGeek.惡意掃描攔截


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
WeiyiGeek.


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è)合并文件的功能宴抚。


(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)系我喲酱固!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末械念,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子运悲,更是在濱河造成了極大的恐慌龄减,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件班眯,死亡現(xiàn)場(chǎng)離奇詭異希停,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)署隘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門宠能,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人定踱,你說我怎么就攤上這事棍潘。” “怎么了崖媚?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵亦歉,是天一觀的道長。 經(jīng)常有香客問我畅哑,道長肴楷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任荠呐,我火速辦了婚禮赛蔫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泥张。我一直安慰自己呵恢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布媚创。 她就那樣靜靜地躺著渗钉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鳄橘,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天声离,我揣著相機(jī)與錄音,去河邊找鬼瘫怜。 笑死术徊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鲸湃。 我是一名探鬼主播赠涮,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼暗挑!你這毒婦竟也來了世囊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤窿祥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蝙寨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晒衩,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年墙歪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了听系。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虹菲,死狀恐怖靠胜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毕源,我是刑警寧澤浪漠,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站霎褐,受9級(jí)特大地震影響址愿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冻璃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一响谓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧省艳,春花似錦娘纷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枣购,卻和暖如春嬉探,著一層夾襖步出監(jiān)牢的瞬間擦耀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工涩堤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眷蜓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓胎围,卻偏偏與公主長得像吁系,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子白魂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容