nginx相關優化
一、隱藏nginx header內版本號信息
一些特定的系統及服務漏洞一般都和特定的軟件和版本號有關,我們儘量隱藏服務器的敏感信息(軟件名稱及版本等信息),這樣×××無法準確猜到有漏洞的服務是否對應服務的版本,從而確保web服務器最大的安全。
1、利用curl查看隱藏前header內的web版本號信息。
[root@centos4 ~]# curl -I 192.168.115.10
HTTP/1.1 502 Bad Gateway
Server: nginx/1.12.1 這裏顯示Nginx的版本
Date: Sun, 24 Sep 2017 13:33:25 GMT
2、用瀏覽器訪問web服務有時候也會出現軟件名稱和版本號。
以上兩種方式訪問不但暴露了Nginx軟件的名稱,而且暴露了Nginx特定的版本號,這樣就會給服務的安全帶來一定的風險,應禁止掉。
3、修改配置文件參數實現隱藏版本號
在nginx配置文件nginx.conf中的http標籤下加入“server_tokens off;”如下:
[root@centos4 conf]# vim nginx.conf
http {
server_tokens off;
…………………………………………………省略若干
:wq
[root@centos4 conf]# /usr/local/nginx-1.12.1/sbin/nginx -s reload [root@centos4 conf]# curl -I 192.168.115.10
HTTP/1.1 200 OK
Server: nginx 這裏已經沒有Nginx的版本了
Date: Sun, 24 Sep 2017 13:55:24 GMT
注意:server_tokens off;的放置位置爲http標籤內,如果放錯了位置,加載nginx時會出現如下報錯信息。
[root@centos4 conf]# /usr/local/nginx-1.12.1/sbin/nginx -s reload
nginx: [emerg] "server_tokens" directive is not allowed here in /usr/local/nginx-1.12.1/conf/nginx.conf:5
二、更改nginx的默認用戶及用戶組nobody
1、nginx服務啓動,使用的默認用戶是nobody,爲了防止×××猜到這個用戶,我們需要更改用戶和用戶組,提供給nginx服務用。
[root@centos4 conf]# grep user nginx.conf
#user nobody;
2、更改默認用戶的方法有兩種,第一種爲設置Nginx worker進程運行的用戶以及用戶組,如果註釋或不設置,默認即是nobody用戶和組,不推薦使用nobody用戶名稱,最好採用一個普通用戶,如:nginx
[root@centos4 conf]# useradd nginx -s /sbin/nologin -M 創建一個不能登錄系統的普通用戶
[root@centos4 conf]# grep user nginx.conf
user nginx nginx;
3、更改默認用戶的第二種方法爲編譯的時候添加”--user=nginx --group=nginx”這兩個參數即可。
[root@centos4 nginx-1.12.1]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx-1.12.1
4、最後檢查nginx進程的對應用戶
[root@centos4 ~]# ps -ef|grep nginx|grep -v grep
root 1854 1 0 21:28 ? 00:00:00 nginx: master process /usr/local/nginx-1.12.1/sbin/nginx
nginx 1986 1854 0 22:04 ? 00:00:00 nginx: worker process
我們看到worker process的進程對應的用戶都變成Nginx了。
三、配置nginx worker優化進程個數
1、指定nginx開啓的進程數方法
在高併發場景,我們需要事先啓動更多的nginx進程以保證快速響應並處理用戶的請求。具體的配置參數如下:
[root@centos4 ~]# vim /usr/local/nginx-1.12.1/conf/nginx.conf
worker_processes 1;
指定了nginx要開啓的進程數,建議指定和CPU數量相等或CPU的兩倍
worker_processes參數開始的設置可以等於CPU的個數或核數(worker_cpu_affinity參數中的配置可以指定第一個到最後一個進程分別使用的哪個CPU),進程數多一些,起始提供服務時就不會臨時啓動新進程提供服務,減少了系統的開銷,提升了服務速度。特殊場合也可以考慮提高至CPU*2的進程數,可根據實際情況作出調整。這個參數除了CPU核數影響外和硬盤存儲的數據以及負載也有關。
2、查看Linux服務器的核數
[root@centos4 ~]# grep "physical id" /proc/cpuinfo |sort|uniq|wc -l 查看物理CPU的核數
0
[root@centos4 ~]# grep "cpucores" /proc/cpuinfo|uniq 查看CPU單核心數
[root@centos4 ~]# grep "processor" /proc/cpuinfo|wc -l 查看CPU邏輯核心數
1
3、這裏我們修改worker_processes的參數值爲4,然後重新加載nginx
[root@centos4 ~]# sed -i 's/worker_processes 1/worker_processes 4/g' /usr/local/nginx-1.12.1/conf/nginx.conf 修改參數爲4
[root@centos4 ~]# /usr/local/nginx-1.12.1/sbin/nginx -s reload
[root@centos4 ~]# grep worker_processes /usr/local/nginx-1.12.1/conf/nginx.conf
worker_processes 4; 查看修改後的參數
4、檢查進程數,可以看到,當worker_processes 4時,worker進程數爲4個,master主進程不包含在內。
[root@centos4 ~]# ps -ef|grep nginx|grep -v grep
root 1858 1 0 10:47 ? 00:00:00 nginx: master process /usr/local/nginx-1.12.1/sbin/nginx
nginx 1859 1858 0 10:47 ? 00:00:00 nginx: worker process
nginx 1860 1858 0 10:47 ? 00:00:00 nginx: worker process
nginx 1861 1858 0 10:47 ? 00:00:00 nginx: worker process
nginx 1862 1858 0 10:47 ? 00:00:00 nginx: worker process
四、根據CPU核數進行nginx進程優化
默認情況nginx的多個進程可能更多的跑在一顆CPU上,這裏是分配不同的進程給不同的CPU處理,達到充分利用硬件多核多CPU的目的。
1、不同的CPU對應配置如下
四核CPU服務器:
編輯nginx.conf配置文件,在裏面加入如下信息
[root@centos4 ~]# vim /usr/local/nginx-1.12.1/conf/nginx.conf
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
[root@centos4 ~]# /usr/local/nginx-1.12.1/sbin/nginx -s reload
nginx進程CPU親和力,即把不同的進程分給不同的CPU處理這裏0001 0010 0100 1000是掩碼,表示第1、2、3、4顆CPU核心。
八核CPU服務器:
編輯nginx.conf配置文件,在裏面加入如下信息
[root@centos4 ~]# vim /usr/local/nginx-1.12.1/conf/nginx.conf
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000;
[root@centos4 ~]# /usr/local/nginx-1.12.1/sbin/nginx -s reload
2、掩碼修改完成之後,使用壓力測試命令查看結果
[root@centos4 ~]# webbench -c 20000 -t 180 http://192.168.115.10/
通過觀察,發現配置後不同CPU使用率相對平均,和配置前變化不大,因此默認就比較平均,一方面是軟件自身在逐漸的優化使用多核CPU,另一方面測試的數據也有待調整。
taskset是一個Linux中調節CPU親和力(分配CPU)的命令
taskset -c 1,2,3 /etc/init.d/mysql start 讓MySQL進程跑到CPU的1,2,3核心上。
五、nginx事件處理模型優化
nginx的連接處理機制在不同的操作系統中會採用不同的I/O模型:Linux上使用epoll的IO多路複用模型,在freebsd使用kqueue的IO多路複用模型,在Solaris中使用/dev/poll方式的多路複用模型,在windows中使用icop.等等。
根據系統類型的不同,選擇不同use[ kqueue | rtsig | epoll | /dev/poll | select | poll ];該參數結合系統使用,不同系統使用參數不同,我們使用的是centos 6.8,因此我們調整爲epoll模型。
具體的配置參數如下。
events events指令是設定Nginx的工作模式及連接數上限
{
worker_connections 1024;
use epoll;
use是個事件模塊指令,用來指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中,對於Linux系統linux2.6+的內核,推薦選擇epoll工作模式,這是高性能高併發的設置。
}
六、調整單個進程允許的客戶端最大連接數。
這個值根據具體服務器性能和程序的內存使用量來指定(一個進程啓動使用的內存根據程序確定)
events { events指令是設定Nginx的工作模式及連接數上限
worker_connections 1024;
worker_connections也是個事件模塊指令,用於定義Nginx每個進程的最大連接數,默認是1024,最大客戶端連接數由worker_processes和worker_connections決定,即Max_client=worker_processes*worker_connections。進程的最大連接數受Linux系統進程的最大打開文件數限制,在執行操作系統命令“ulimit -Hsn 65535”或配置相應文件後worker_connections的設置才能生效。
}
七、配置每個進程最大文件打開數
worker_rlimit_nofile 65535;
每個進程打開的最大文件數,可設置爲系統優化後的ulimit-Hsn的結果,在之前安裝系統時,調整文件描述符和這個處理的一個問題。在http://nginx.org/en/docs/ngx_core_module.html這個模塊裏。
八、優化服務器名字的hash表大小
確切名字和通配符名字存儲在哈希表中,哈希表和監聽端口關聯,每個端口最多關聯到三張表,確切名字的哈希表,以星號起始的通配符名字的哈希表和以星號結束的通配符名字的哈希表。哈希表的尺寸在配置階段進行了優化,可以以最小的CPU緩存命中失敗來找到名字。因爲名字是按照域名的節來搜索的,所以搜索通配符名字的哈希表比搜索確切名字的哈希錶慢。
注意:.nginx.org存儲在通配符名字的哈希表中,而不在確切名字的哈希表中。正則表達式是一個一個串行的測試,所以是最慢的,而且不可擴展。
鑑於以上原因,請儘可能使用確切的名字,例如:使用nginx.org和www.nginx.org來訪問服務器是最頻繁的,那麼將他們明確的定義出來就更爲有效。
server {
listen 80;
server_name nginx.org www.nginx.org;
不要使用*.nginx.org這樣的域名匹配。
……………………………..
}
下面這種方法相比更簡單,但是效率也更低:
server {
listen 80;
server_name .nginx.org;
……………
}
如果定義了大量名字,或者定義了非常長的名字,那就需要在http配置塊中調整server_names_hash_max_size和server_names_hash_bucket_size的值。
server_names_hash_bucket_size的默認值可能是32,或者64,或者是其他值,取決於CPU的緩存行的長度。如果這個值是32,那麼定義”too.long.server.name.nginx.org”作爲虛擬主機名就會失敗,顯示下面錯誤的信息:
could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32
出現了這種情況,那就需要將設置值擴大一倍
http {
server_names_hash_bucket_size 64;
如果定義了大量名字,得到了另外一個錯誤.
could not build the server_names_hash,
you should increase either server_names_hash_max_size: 512
or server_names_hash_bucket_size: 32
那麼應該先嚐試設置server_names_hash_max_size的值差不多等於名字列表的名字總量。如果還不能解決問題,或者服務器啓動非常緩慢,再嘗試提高server_names_hash_bucket_size的值。
如果只爲一個監聽端口配置了唯一的主機,那麼nginx就完全不會測試虛擬機主機名了(也不會建立那些名字哈希表)。不過,有一個例外,如果server_name是一個含有捕獲組的正則表達式,這是nginx就不得不執行這個表達式以得到捕獲組。
server_names_hash_max_size 512;
默認是512KB,一般要查看系統給出確切的值,這裏一般CPU L1的4-5倍。
九、開啓高效文件傳輸模式
sendfile on;
sendfile參數用於開啓文件高效傳輸模式。同時將tcp_nopush和tcp_nodelay兩個指令設置爲on用於防止網絡阻塞。
tcp_nopush on;
打開Linux下TCP_CORK,sendfile參數打開時纔有效,作減少報文段的數量之用
十、設置連接的超時時間
keepalive_timeout 65;
設置客戶端連接保持會話的超時時間。超過這個時間服務器會關閉該連接
tcp_nodelay on;
打開tcp_nodelay,在包含了keepalive參數纔有效
client_header_timeout 15;
設置客戶端請求頭讀取超時時間,如超過這個時間,客戶端還沒有發送任何數據,nginx將返回”Request timeout(408)”錯誤。
client_body_timeout 15;
設置客戶端請求主體讀取超時時間。如超過這個時間,客戶端還沒有發送任何數據,nginx將返回”Request timeout(408)”錯誤,默認值是60。
send_timeout 15;
指定響應客戶端的超時時間。這個超時僅限於兩個連接活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連接。
十一、上傳文件大小限制(動態應用)
Nginx主配置文件nginx.conf里加入如下參數,具體大小根據自己的業務做調整。
client_max_body_size 10m;
十二、fastcgi調優(配合PHP引擎動態服務)
fastcgi_connect_timeout 300;
指定連接後到後端fastCGI的超時時間
fastcgi_send_timeout 300;
向fastCGI傳送請求的超時時間,這個值是指已經完成兩次握手後向fastCGI傳送請求的超時時間
fastcgi_read_timeout 300;
指定接收fastCGI應答的超時時間,這個值是指已經完成兩次握手後接收fastCGI應答的超時時間
fastcgi_buffer_size 64k;
指定讀取fastCGI應答第一部分需要用多大的緩衝區,這個值表示將使用1個64KB的緩衝區讀取應答的第一部分(應答頭),可以 設置爲fastcgi_buffers選項指定的緩衝區大小。
fastcgi_buffers 4 64k;
指定本地需要用多少和多大的緩衝區來緩衝fastCGI的應答請求。如果一個PHP腳本所產生的頁面大小爲256KB,那麼會爲其分配4個64KB的緩衝區來緩存;如果頁面大小大於256KB的部分會緩存到fastcgi_temp指定的路徑中,但是這並不是好方法,因爲內存中的塑膠處理速度要快於硬盤。一般這個值應該爲站點中PHP腳本所產生的頁面大小的中間值,如果站點大部分腳本所產生的頁面大小爲256KB,那麼可以把這個值設置爲”16 16k”、”4 64k”等。
fastcgi_busy_buffers_size 128k;
建議爲fastcgi_buffers的兩倍
fastcgi_temp_file_write_size 128k;
在寫入fastcgi_temp_path時將用多大的數據塊,默認值是fastcgi_buffers的兩倍,設置上述數值設置太小時若負載上來時可能報502 Bad Gateway
fastcgi_cache oldboy_nginx;
表示開啓fastCGI緩存併爲其指定一個名詞。開啓緩存非常有用,可以有效降低CPU的負載,並且防止502錯誤的發送,但是開啓緩存也肯會引起其他問題,要根據具體情況選擇
fastcgi_cache_valid 200 302 1h;
用來指定應答代碼的緩存時間,實例中的值表示將200和302應答緩存一個小時
fastcgi_cache_valid 301 1d;
將301應答緩存1天
fastcgi_cache_valid any 1m;
將其他應答緩存爲1分鐘
fastcgi_cache_min_uses 1;
緩存在fastcgi_cache_path指令inactive參數值時間內的最少使用次數
十三、配置Nginx gzip壓縮功能
Nginx gzip壓縮模塊提供了對文件內容壓縮的功能,允許nginx服務器將輸出內容在發送到客戶端之前根據具體的策略進行壓縮,以節約網站帶寬,同時提升用戶訪問體驗。缺點是佔用服務器CPU資源。
此功能同Apache的mod_deflate壓縮功能,依賴ngx_http_gzip_module模塊,默認已裝。
壓縮從程序來看,所有的程序文件(包括js,css,html文件)都需要壓縮;不需要壓縮的內容有(圖片,視頻,flash文件)不需要壓縮。總之就是數據、文本需要壓縮,二進制文件,視頻等不需要壓縮。
對應的壓縮參數說明如下
gzip on; 開啓gzip壓縮功能
gzip_min_length 1k;
設置允許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取。默認值是0,不管頁面多大都進行壓縮,建議設置成大於1K。如果小於1K可能會越壓越大。
gzip_buffers 4 16k;
壓縮緩衝區大小。表示申請4個單位爲16K的內存作爲壓縮結構流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。
gzip_http_version 1.0;
壓縮版本(默認1.1,前端爲squid2.5時使用1.0)用於設置識別http協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP解壓,使用默認即可(這個參數可以不加)。
gzip_comp_level 2;
壓縮比率,用來指定gzip壓縮比,1 壓縮比最小,處理速度最快;9 壓縮比最大,傳輸速度快,但處理最慢,也比較消耗CPU資源。
gzip_types text/plain application/x-javascript text/css application/xml;
用來指定壓縮的類型,”text/html”類型總是會被壓縮。
gzip_vary on;
vary header支持。該選項可以讓前端的緩存服務器緩存經過gzip壓縮的頁面,例如用squid緩存經過nginx壓縮的數據。
完整的配置如下(這些配置可以放在http標籤下面,表示全局生效;也可以放在server標籤下面,表示server標籤內的主機生效)
[root@centos4 ~]# /usr/local/nginx-1.12.1/sbin/nginx 啓動Nginx服務
[root@centos4 ~]# cd /usr/local/nginx-1.12.1/conf/
[root@centos4 conf]# vim nginx.conf
http {
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
……………………………………….下面省略若干
通過火狐瀏覽器加yslow插件查看gzip壓縮及expires緩存結果。
通過curl命令查看nginx的gzip壓縮結果
[root@centos6 nginx-1.12.1]# curl -I -H "Accept-Encoding: gzip, deflate" "http://192.168.115.10/jquery.js"
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Thu, 26 Oct 2017 05:25:06 GMT
Content-Type: application/javascript 這裏是gzip壓縮的文件類型
Last-Modified: Mon, 09 Oct 2017 07:18:26 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: W/"59db22c2-119ee"
Content-Encoding: gzip 這裏顯示gzip就說明啓用了gzip壓縮功能
需要和不需要壓縮的對象。
大於1K的純文本文件html,js,css,xml,shtml等需要壓縮。
圖片,視頻等不要壓縮。因爲不但不會減小,在壓縮時還消耗CPU,MEM資源。
十四、配置nginx expires緩存功能
1、設置expires緩存的優缺點
設置expires優點:可以降低網站購買的帶寬,節約成本同時提升了用戶的訪問體驗,減輕服務器的壓力,是web服務非常重要的功能。
設置expires缺點:被緩存的頁面更新了,用戶看到的可能還是舊的內容(jss,css,圖片),反而影響用戶體驗。
解決方法:
1、縮短緩存時間。
2、對緩存的對象改名。圖片,附件一般不會被用戶修改,如果用戶修改了,實際上也都是改文件名重新上傳,網站升級對於js,css元素,一般可以改名。把css,js,推送到cdn。
2、一般不需要緩存的內容
一般不需要緩存的內容:廣告圖片,網站流量統計文件,更新頻繁的文件。
在網站開發和運營中,對圖片,CSS,JS等元素更改機會較少,特別是圖片,這時可以將圖片設置在瀏覽器本地緩存365天或更長,CSS,JS,HTML等代碼緩存10天,這樣用戶第一次打開頁面後,會在本地的瀏覽器緩存相應的上述內容,這樣的緩存可以提高下次用戶打開類似頁面的加載速度,並節省服務器端大量的帶寬。此功能同Apache的expires
3、通過location配置expires緩存
這裏通過location的功能,將需要緩存的擴展名列出來,然後指定緩存時間。
例1:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 3650d;
}
例2:
location ~ .*\.(js|css)?$
{
expires 30d;
}
特別注意:location內容一般放到虛擬主機配置中,即server標籤中
4、根據目錄進行判斷,添加 expires 功能範例
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
可以使用yslow插件或通過curl命令即可查看gzip壓縮和expires緩存結果。
5、通過curl命令查看緩存結果
[root@centos1 ~]# curl -I https://www.taobao.com
HTTP/1.1 200 OK
Server: Tengine
Date: Thu, 26 Oct 2017 08:22:04 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Vary: Ali-Detector-Type, X-CIP-PT
Cache-Control: max-age=60, s-maxage=90
Via: cache7.l2cn708[384,200-0,M], cache3.l2cn708[385,0], cache1.cn310[0,200-0,H], cache5.cn310[1,0]
Age: 44
X-Cache: HIT TCP_MEM_HIT dirn:-2:-2 mlen:-1
X-Swift-SaveTime: Thu, 26 Oct 2017 08:21:20 GMT
X-Swift-CacheTime: 90
Timing-Allow-Origin: *
EagleId: 7cc1ebe615090061244154222e
Set-Cookie: thw=cn; Path=/; Domain=.taobao.com; Expires=Fri, 26-Oct-18 08:22:04 GMT;
Strict-Transport-Security: max-age=31536000
6、單個文件添加expires功能範例
給robots.txt設置過期時間,這裏爲robots.txt爲7天並不記錄404錯誤日誌。
location ~(robots.txt) {
log_not_found off;
expires 7d;
break;
}
總體完全配置爲:
server
{
listen 80;
server_name www.long.com;
index index.html index.htm index.php;
root /data/www/blog;
access_log /var/logs/blog_access.log commonlog;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 3650d;
}
location ~ .*\.(js|css)?$
{
expires 30d
}
location ~(robots.txt) {
log_not_found off;
expires 7d;
break;
}
#add expires header according to dir.
location ~ ^/(images|javascript|js|css|flash|media|static) {
expires 360d;
}
}
十五、Nginx日誌相關優化與安全
1、編寫腳本實現Nginx access日誌輪循
Nginx沒有類似Apache的cronolog日誌分割處理的功能,但是可以通過Nginx的信號控制功能或者reload重新加載,然後用腳本實現日誌的自動切割。
詳細操作過程如下:
n 配置日誌切割腳本
cat cut_nginx_log.sh
#!/bin/bash
cd /usr/local/nginx/logs &&\
/bin/mv www_access.log www_access_$(date +%F –d -1day).log
/usr/local/nginx/sbin/nginx –s reload
這個腳本的功能很簡單,就是把原來的日誌改名,然後重新加載Nginx,生成文件記錄日誌
n 將這段腳本保存後加入到linux的crontab守護進程,讓此腳本在每天凌晨執行,就可以實現日誌的每天分割功能了,
2、禁止記錄不需要的訪問日誌
對於健康檢查或某些圖片的日誌,一般不需要記錄,因爲在統計PV時是按照頁面的計算。而且日誌寫入頻繁會消耗磁盤IO,降低服務性能。
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
十六、最小化網站目錄及文件權限設置。
爲了保證網站不遭受×××***上傳及修改文件。
安全的權限:
1、所有站點目錄的用戶和組都應該爲root
2、所有目錄權限是默認的755
3、所有文件權限是默認的644
注意:網站服務的用戶不能用root
十七、最小化日誌目錄權限。
假如日誌目錄爲/var/logs,則授權方法爲:
chown –R root.root /var/logs
chmod –R 700 /var/logs
十八、Nginx站點目錄及文件URL訪問控制
Nginx下禁止訪問資源目錄下的PHP程序文件,配置方法如下:
例1:Nginx配置限制指定目錄下的PHP程序被解析
location ~ ^ /images/.*\.(php|php5)$
{
Deny all;
}
#靜態文件中有php文件就拒絕執行。
location ~ ^ /static/.*\.(php|php5)$
{
dell all;
}
location ~* ^ /data/(attachment|avatar)/.*\.(php|php5)$
{
deny all;
}
這些目錄的限制必須寫在一些配置的前面:
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
例2:Nginx下配置禁止訪問*.txt文件
location ~* \.(txt|doc)$ {
if (-f $request_filename) {
root /date/www/www;
# rewrite ……..可以重定向到某個URL
break;
}
}
location ~* \.(txt|doc)$ {
root /date/www/www;
deny all;
}
十九、禁止訪問指定目錄下所有的文件和目錄。
例1:配置禁止訪問指定的單個或多個目錄。
單目錄:
location ~ ^/(static)/ {
deny all;
}
location ~ ^/static {
deny all;
}
多目錄:
location ~ ^/(static|js) {
deny all;
}
例2:禁止訪問目錄並返回指定的http狀態碼。
location /admin/ { return 403; }
location /templates/ { return 403;}
例:
server {
listen 80;
server_name www.long.com long.com;
root /data0/www/www;
index index.html index.htm;
access_log /var/logs/www_access.log commonlog;
location /admin/ { return 404; }
location /templates/ { return 403; }
二十、限制來源IP訪問。
使用ngx_http_access_module限制IP訪問
例1:禁止某目錄讓外界訪問,但允許某IP訪問該目錄,且支持PHP解析
location ~ ^/long/ {
allow 202.111.12.211;
deny all;
}
location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
例2:限制及指定IP或IP段訪問
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
二十一、設置Nginx錯誤頁面優雅顯示
例1:錯誤碼403跳轉
server {
listen 80;
server_name www.long.com;
location / {
root html/www;
index index.html index.htm;
}
error_page 403 /403.html; 此路徑相對於root html/www;的
}
例2:錯誤碼404錯誤本地文件優雅顯示
error_page 404 /404.html;
server {
listen 80;
server_name www.long.com;
location / {
root /data0/www/bbs;
index index.html index.htm;
error_page 404 /404.html;
access_log /var/logs/bbs_access_log commonlog;
}
}
提示:注意寫法,/404.html爲/data0/www/bbs目錄下的文件。
例3: 50x頁面本地單獨目錄下文件優雅顯示。
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /data0/www/html;
}
提示:指定單獨的站點目錄存放50x.html文件。
例4:改變狀態碼爲新的狀態碼,並顯示指定的文件內容。
server {
listen 80;
server_name www.long.com;
location / {
root /data0/www/bbs;
index index.html index.htm;
fastcgi_intercept_errors on;
error_page 404 = 200 /ta.jpg;
access_log /var/logs/bbs_access.log commonlog;
例5:錯誤狀態碼url重定向。
error_page 403 http://example.com/forbiden.html;
error_page 404 = 301 http://example.com/notfound.html;
fastcgi_intercept_errors on;
error_page 403 /403.html;
error_page 404 http://long.blog.51cto.com;
例6:將錯誤狀態碼重定向到一個location.
location / {
error_page 404 = @fallback;
}
location @fallback {
proxy_pass http://backend;