[root@linuxprobe ~]# wget http://nginx.org/download/nginx-1.10.1.tar.gz[root@linuxprobe ~]# tar xvf nginx-1.10.1.tar.gz -C /usr/local/src/[root@linuxprobe ~]# cd /usr/local/src/nginx-1.10.1/
編譯前的優化主要是用來修改程序名等等,例如:
[root@linuxprobe nginx-1.10.1]# curl -I http://www.baidu.com……Server: bfe/1.0.8.14……[root@linuxprobe nginx-1.10.1]# curl -I http://www.sina.com.cn……Server: nginx……
[root@linuxprobe nginx-1.10.1]# curl -I http://www.linuxprobe.comHTTP/1.1 200 OKServer: nginx/1.10.1 #我們目標是將nginx更改名字Content-Type: text/html; charset=UTF-8Connection: keep-aliveX-Powered-By: PHP/5.6.29Set-Cookie: PHPSESSID=smm0i6u4f9v7bj0gove79ja1g7; path=/Cache-Control: no-cacheDate: Mon, 07 Seq 2016 06:09:11 GMT
[root@linuxprobe nginx-1.10.1]# vim src/core/nginx.h
#define NGINX_VERSION "nginx_stable" #此行修改的是你想要的版本號
#define NGINX_VER "linuxprobe/" NGINX_VERSION #此行修改的是你想修改的軟件名稱
[root@linuxprobe nginx-1.10.1]# vim +49 src/http/ngx_http_header_filter_module.c
拓展:通用http頭域
通用頭域包含請求和響應消息都支持的頭域,通用頭域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。對通用頭域的擴展要求通訊雙方都支持此擴展,如果存在不支持的通用頭域,一般將會作為實體頭域處理。那麼也就是說有部分設備,或者是軟件,能獲取到connection,部分不能,要隱藏就要徹底!
static char ngx_http_server_string[] = "Server: LinuxprobeWeb" CRLF;
[root@linuxprobe nginx-1.10.1]# vim +29 src/http/ngx_http_special_response.c
有時候我們頁面程序出現錯誤,Nginx會代我們返回相應的錯誤代碼,回顯的時候,會帶上nginx和版本號,我們把他隱藏起來
static u_char ngx_http_error_full_tail[] ="<hr><center>" NGINX_VER "</center>" CRLF"</body>" CRLF"</html>" CRLF;
修改後
static u_char ngx_http_error_tail[] ="<hr><center>LinuxprobeWeb</center>" CRLF"</body>" CRLF"</html>" CRLF;Nginx正式安裝一鍵安裝相關依賴包
[root@linuxprobe nginx-1.10.1]# yum install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel -y安裝pcre依賴
#本地下載pcre上傳到服務器
[root@linuxprobe]# tar zxvf /usr/local/src/pcre-8.36.tar.gz -C /usr/local/src/[root@linuxprobe nginx-1.10.1]# cd /usr/local/src/pcre-8.36[root@linuxprobe nginx-1.10.1]# ./configure && make && make install[root@linuxprobe nginx-1.10.1]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.36 --with-openssl=/usr/include/openssl
注意:TCP_FASTOPEN 只在 3.7.1 以及更新的 Linux 內核版本才支持--with-http_dav_module #啟用支持(增加PUT,DELETE,MKCOL:創建集合,COPY和MOVE方法)默認關閉,需要編譯開啟--with-http_stub_status_module #啟用支持(獲取Nginx上次啟動以來的工作狀態)--with-http_addition_module #啟用支持(作為一個輸出過濾器,支持不完全緩沖,分部分相應請求)--with-http_sub_module #啟用支持(允許一些其他文本替換Nginx相應中的一些文本)--with-http_flv_module #啟用支持(提供支持flv視頻文件支持)--with-http_mp4_module #啟用支持(提供支持mp4視頻文件支持,提供偽流媒體服務端支持)--with-pcre=/usr/local/src/pcre-8.36 #需要注意,這裡指的是源碼,用#./configure --help |grep pcre查看幫助
[root@linuxprobe nginx-1.10.1]# make && make install
#Nginx安裝路徑。如果沒有指定,默認為 /usr/local/nginx。--prefix=PATH #Nginx可執行文件安裝路徑。只能安裝時指定,如果沒有指定,默認為PATH/sbin/nginx。--sbin-path=PATH #在沒有給定-c選項下默認的nginx.conf的路徑。如果沒有指定,默認為PATH/conf/nginx.conf。 --conf-path=PATH #在nginx.conf中沒有指定pid指令的情況下,默認的nginx.pid的路徑。如果沒有指定,默認為 PATH/logs/nginx.pid。--pid-path=PATH #nginx.lock文件的路徑。--lock-path=PATH #在nginx.conf中沒有指定error_log指令的情況下,默認的錯誤日志的路徑。如果沒有指定,默認為 PATH/logs/error.log。--error-log-path=PATH #在nginx.conf中沒有指定access_log指令的情況下,默認的訪問日志的路徑。如果沒有指定,默認為 PATH/logs/access.log。--http-log-path=PATH #在nginx.conf中沒有指定user指令的情況下,默認的nginx使用的用戶。如果沒有指定,默認為 nobody。--user=USER #在nginx.conf中沒有指定user指令的情況下,默認的nginx使用的組。如果沒有指定,默認為 nobody。--group=GROUP #指定編譯的目錄--builddir=DIR #啟用 rtsig 模塊--with-rtsig_module #允許或不允許開啟SELECT模式,如果configure沒有找到合適的模式,比如,kqueue(sun os)、epoll(linux kenel 2.6+)、rtsig(實時信號)--with-select_module(--without-select_module) #允許或不允許開啟POLL模式,如果沒有合適的,則開啟該模式。--with-poll_module(--without-poll_module) #開啟HTTP SSL模塊,使NGINX可以支持HTTPS請求。這個模塊需要已經安裝了OPENSSL,在DEBIAN上是libssl-dev--with-http_ssl_module #啟用ngx_http_ssl_module--with-http_realip_module #啟用 ngx_http_realip_module--with-http_addition_module #啟用 ngx_http_addition_module--with-http_sub_module #啟用 ngx_http_sub_module--with-http_dav_module #啟用 ngx_http_dav_module--with-http_flv_module #啟用 ngx_http_flv_module--with-http_stub_status_module #啟用 "server status" 頁--without-http_charset_module #禁用 ngx_http_charset_module--without-http_gzip_module #禁用 ngx_http_gzip_module. 如果啟用,需要 zlib 。--without-http_ssi_module #禁用 ngx_http_ssi_module--without-http_userid_module #禁用 ngx_http_userid_module--without-http_access_module #禁用 ngx_http_access_module--without-http_auth_basic_module #禁用 ngx_http_auth_basic_module--without-http_autoindex_module #禁用 ngx_http_autoindex_module--without-http_geo_module #禁用 ngx_http_geo_module--without-http_map_module #禁用 ngx_http_map_module--without-http_referer_module #禁用 ngx_http_referer_module--without-http_rewrite_module #禁用 ngx_http_rewrite_module. 如果啟用需要 PCRE 。--without-http_proxy_module #禁用 ngx_http_proxy_module--without-http_fastcgi_module #禁用 ngx_http_fastcgi_module--without-http_memcached_module #禁用 ngx_http_memcached_module--without-http_limit_zone_module #禁用 ngx_http_limit_zone_module--without-http_empty_gif_module #禁用 ngx_http_empty_gif_module--without-http_browser_module #禁用 ngx_http_browser_module--without-http_upstream_ip_hash_module #禁用 ngx_http_upstream_ip_hash_module--with-http_perl_module - #啟用 ngx_http_perl_module--with-perl_modules_path=PATH #指定 perl 模塊的路徑--with-perl=PATH #指定 perl 執行文件的路徑--http-log-path=PATH #Set path to the http access log--http-client-body-temp-path=PATH #Set path to the http client request body temporary files--http-proxy-temp-path=PATH #Set path to the http proxy temporary files--http-fastcgi-temp-path=PATH #Set path to the http fastcgi temporary files--without-http #禁用 HTTP server--with-mail #啟用 IMAP4/POP3/SMTP 代理模塊--with-mail_ssl_module #啟用 ngx_mail_ssl_module--with-cc=PATH #指定 C 編譯器的路徑--with-cpp=PATH #指定 C 預處理器的路徑--with-cc-opt=OPTIONS #--with-ld-opt=OPTIONS #Additional parameters passed to the linker. With the use of the system library PCRE in FreeBSD, it is necessary to indicate --with-ld-opt="-L /usr/local/lib".--with-cpu-opt=CPU #為特定的CPU編譯,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64--without-pcre #禁止PCRE庫的使用。同時也會禁止 HTTP rewrite 模塊。在 "location" 配置指令中的正則表達式也需要 PCRE 。--with-pcre=DIR #指定 PCRE 庫的源代碼的路徑。--with-pcre-opt=OPTIONS #設置PCRE的額外編譯選項。--with-md5=DIR #使用MD5匯編源碼。--with-md5-opt=OPTIONS #Set additional options for md5 building.--with-md5-asm #Use md5 assembler sources.--with-sha1=DIR #Set path to sha1 library sources.--with-sha1-opt=OPTIONS #Set additional options for sha1 building.--with-sha1-asm #Use sha1 assembler sources.--with-zlib=DIR #Set path to zlib library sources.--with-zlib-opt=OPTIONS #Set additional options for zlib building.--with-zlib-asm=CPU #Use zlib assembler sources optimized for specified CPU, valid values are: pentium, pentiumpro--with-openssl=DIR #Set path to OpenSSL library sources--with-openssl-opt=OPTIONS #Set additional options for OpenSSL building--with-debug #啟用調試日志--add-module=PATH #Add in a third-party module found in directory PATH啟動nginx
[root@linuxprobe nginx-1.10.1]# /usr/local/nginx/sbin/nginx[root@linuxprobe nginx-1.10.1]# netstat -antup | grep nginxtcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 52553/nginx
測試是否隱藏了版本和軟件名
[root@linuxprobe nginx-1.10.1]# cd[root@linuxprobe ~]# curl -I http://127.0.0.1
錯誤代碼測試(盡量使用firefox或者類360浏覽器)
Nginx運行用戶
[root@linuxprobe~]# useradd -M -s /sbin/nologin nginx //修改nginx默認運行用戶[root@linuxprobe ~]# ps -aux | grep nginx //默認是nobody用戶nobody 52554 0.0 0.1 22660 1568 ? S 14:39 0:00 nginx: worker process[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.confuser nginx;[root@linuxprobe ~]# /usr/local/nginx/sbin/nginx -s reload[root@linuxprobe ~]# ps -aux | grep nginxnginx 52555 0.0 0.1 22660 1568 ? S 14:39 0:00 nginx: worker process
在這裡我們還可以看到在查看的時候,work進程是nginx用戶了,但是master進程還是root
其中,master是監控進程,也叫主進程,work是工作進程,部分還有cache相關進程,關系如圖:
所以我們可以master監控進程使用root,可以是降級使用普通用戶,如果都是用普用戶,注意編譯安裝的時候,是用普通用戶執行,sudo方式操作!可以直接理解為master是管理員,work進程才是為用戶提供服務的!
Nginx運行進程個數,一般我們設置CPU的核心或者核心數x2,如果你不了解,top命令之後按1也可以看出來(一般直接追到線程即可)
[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.confworker_processes 2;[root@linuxprobe ~]# /usr/local/nginx/sbin/nginx -s reload[root@linuxprobe ~]# ps -axu | grep nginxnginx 52686 0.0 0.1 22668 1300 ? S 15:10 0:00 nginx: worker processnginx 52687 0.0 0.1 22668 1376 ? S 15:10 0:00 nginx: worker process
Nginx運行CPU親和力(這個要根據你的CPU線程數配置)
比如4核4線程配置
[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.confworker_processes 4;worker_cpu_affinity 0001 0010 0100 1000;
比如8核8線程配置
worker_processes 8;worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
那麼如果我是4線程的CPU,我只想跑兩個進程呢?
worker_processes 2;worker_cpu_affinity 0101 1010;
意思就似乎我開啟了第一個和第三個內核,第二個和第四個內核,兩個進程分別在這兩個組合上輪詢!worker_processes最多開啟8個,8個以上性能提升不會再提升了,而且穩定性變得更低,所以8個進程夠用了。
Nginx最多可以打開文件數 worker_rlimit_nofile 65535;
這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值保持一致。
Nginx事件處理模型
events {use epoll;worker_connections 1024;}
知道在linux下nginx采用epoll事件模型,處理效率高,關於epoll的時間處理其他只是,可以自行百度,了解即可!
Work_connections是單個進程允許客戶端最大連接數,這個數值一般根據服務器性能和內存來制定,也就是單個進程最大連接數,實際最大值就是work進程數乘以這個數,如何設置,可以根據設置一個進程啟動所占內存,top -u nginx,但是實際我們填入一個65535,足夠了,這些都算並發值,一個網站的並發達到這麼大的數量,也算一個大站了!
開啟高效傳輸模式
http {include mime.types;default_type application/octet-stream;……sendfile on;#tcp_nopush on;…… Include mime.types; 媒體類型 default_type application/octet-stream; 默認媒體類型足夠 sendfile on; 開啟高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。 tcp_nopush on; 必須在sendfile開啟模式才有效,防止網路阻塞,積極的減少網絡報文段的數量
連接超時時間
主要目的是保護服務器資源,CPU,內存,控制連接數,因為建立連接也是需要消耗資源的,TCP的三次握手四次揮手等,我們一般斷掉的是那些建立連接但是不做事兒,也就是我建立了鏈接開始,但是後續的握手過程沒有進行,那麼我們的鏈接處於等待狀態的,全部斷掉!
同時我們也希望php建議短鏈接,消耗資源少
Java建議長鏈接,消耗資源少
keepalive_timeout 60;tcp_nodelay on;client_header_timeout 15;client_body_timeout 15;send_timeout 15;keepalived_timeout 客戶端連接保持會話超時時間,超過這個時間,服務器斷開這個鏈接tcp_nodelay;也是防止網絡阻塞,不過要包涵在keepalived參數才有效client_header_timeout 客戶端請求頭讀取超時時間,如果超過這個時間沒有發送任何數據,nginx將返回request time out的錯誤client_body_timeout 客戶端求主體超時時間,超過這個時間沒有發送任何數據,和上面一樣的錯誤提示send_timeout 響應客戶端超時時間,這個超時時間僅限於兩個活動之間的時間,如果超哥這個時間,客戶端沒有任何活動,nginx關閉連接
文件上傳大小限制
我們知道PHP可以修改上傳文件大小限制,nginx也可以修改
http {……client_max_body_size 10m;Fastcgi調優
Nginx沒有配置factcgi,你使用nginx是一個失敗的方法,配置之前。了解幾個概念:
Cache: 寫入緩存區Buffer: 讀取緩存區Fastcgi 是靜態服務和動態服務的一個接口fastcgi_connect_timeout 300; #指定鏈接到後端FastCGI的超時時間。fastcgi_send_timeout 300; #向FastCGI傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI傳送請求的超時時間。fastcgi_read_timeout 300; #指定接收FastCGI應答的超時時間,這個值是指已經完成兩次握手後接收FastCGI應答的超時時間。fastcgi_buffer_size 64k; #指定讀取FastCGI應答第一部分需要用多大的緩沖區,這個值表示將使用1個64KB的緩沖區讀取應答的第一部分(應答頭),可以設置為gastcgi_buffers選項指定的緩沖區大小。fastcgi_buffers 4 64k; #指定本地需要用多少和多大的緩沖區來緩沖FastCGI的應答請求,如果一個php腳本所產生的頁面大小為256KB,那麼會分配4個64KB的緩沖區來緩存,如果頁面大小大於256KB,那麼大於256KB的部分會緩存到fastcgi_temp指定的路徑中,但是這並不是好方法,因為內存中的數據處理速度要快於磁盤。一般這個值應該為站點中php腳本所產生的頁面大小的中間值,如果站點大部分腳本所產生的頁面大小為256KB,那麼可以把這個值設置為“8 16K”、“4 64k”等。fastcgi_busy_buffers_size 128k; #建議設置為fastcgi_buffer的兩倍,繁忙時候的bufferfastcgi_temp_file_write_size 128k; #在寫入fastcgi_temp_path時將用多大的數據庫,默認值是fastcgi_buffers的兩倍,設置上述數值設置小時若負載上來時可能報502Bad Gatewayfastcgi_cache aniu_ngnix; #表示開啟FastCGI緩存並為其指定一個名稱。開啟緩存非常有用,可以有效降低CPU的負載,並且防止502的錯誤放生,但是開啟緩存也可能會引起其他問題,要很據具體情況選擇fastcgi_cache_valid 200 302 1h; #用來指定應答代碼的緩存時間,實例中的值表示將2000和302應答緩存一小時,要和fastcgi_cache配合使用fastcgi_cache_valid 301 1d; #將301應答緩存一天fastcgi_cache_valid any 1m; #將其他應答緩存為1分鐘fastcgi_cache_min_uses 1; #請求的數量fastcgi_cache_path #定義緩存的路徑
修改nginx.conf配置文件,在http標簽中添加如下:
fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;fastcgi_buffer_size 64k;fastcgi_buffers 4 64k;fastcgi_busy_buffers_size 128k;fastcgi_temp_file_write_size 128k;#fastcgi_temp_path /data/ngx_fcgi_tmp;fastcgi_cache_path /opt/ngx_fcgi_cache levels=2:2keys_zone=ngx_fcgi_cache:512minactive=1d max_size=40g;
緩存路徑,levels目錄層次2級,定義了一個存儲區域名字,緩存大小,不活動的數據在緩存中多長時間,目錄總大小
在server location標簽添加如下:
location ~ .*\.(php|php5)?${fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;fastcgi_cache ngx_fcgi_cache;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 invalid_header http_500;fastcgi_cache_key http://$host$request_uri;}
fastcgi cache官方文檔:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache
gzip調優使用gzip壓縮功能,可能為我們節約帶寬,加快傳輸速度,有更好的體驗,也為我們節約成本,所以說這是一個重點
Nginx啟用壓縮功能需要你來ngx_http_gzip_module模塊,apache使用的是mod_deflate
一般我們需要壓縮的內容有:文本,js,html,css,對於圖片,視頻,flash什麼的不壓縮,同時也要注意,我們使用gzip的功能是需要消耗CPU的!
gzip on; #開啟壓縮功能gzip_min_length 1k; #設置允許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取,默認值是0,不管頁面多大都進行壓縮,建議設置成大於1K,如果小與1K可能會越壓越大。gzip_buffers 4 32k; #壓縮緩沖區大小,表示申請4個單位為32K的內存作為壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。gzip_http_version 1.1; #壓縮版本(默認1.1,前端為squid2.5時使用1.0)用於設置識別HTTP協議版本,默認是1.1,目前大部分浏覽器已經支持GZIP解壓,使用默認即可gzip_comp_level 9; #壓縮比例,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,但是處理慢,也比較消耗CPU資源。gzip_types text/css text/xml application/javascript; #用來指定壓縮的類型,‘text/html’類型總是會被壓縮。gzip_vary on; #vary header支持,改選項可以讓前端的緩存服務器緩存經過GZIP壓縮的頁面,例如用Squid緩存經過nginx壓縮的數據
那麼配置壓縮的過程中,會有一下參數
gzip on;gzip_min_length 1k;gzip_buffers 4 32k;gzip_http_version 1.1;gzip_comp_level 9;gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;gzip_vary on;gzip_proxied expired no-cache no-store private auth;gzip_disable "MSIE [1-6]\.";expires緩存調優
緩存,主要針對於圖片,css,js等元素更改機會比較少的情況下使用,特別是圖片,占用帶寬大,我們完全可以設置圖片在浏覽器本地緩存365d,css,js,html可以緩存個10來天,這樣用戶第一次打開加載慢一點,第二次,就非常快樂!緩存的時候,我們需要將需要緩存的拓展名列出來!
Expires緩存配置在server字段裡面
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${expires 3650d;}location ~ .*\.(js|css)?${expires 30d;}
同時也可以對目錄及其進行判斷:
location ~ ^/(images|javascript|js|css|flash|media|static)/ {expires 360d;}location ~(robots.txt) {expires 7d;break;}
expire功能優點
(1)expires可以降低網站購買的帶寬,節約成本
(2)同時提升用戶訪問體驗
(3)減輕服務的壓力,節約服務器成本,甚至可以節約人力成本,是web服務非常重要的功能。
expire功能缺點:
被緩存的頁面或數據更新了,用戶看到的可能還是舊的內容,反而影響用戶體驗。
解決辦法:
第一個 縮短緩存時間,例如:1天,不徹底,除非更新頻率大於1天
第二個 對緩存的對象改名
a.圖片,附件一般不會被用戶修改,如果用戶修改了,實際上也是更改文件名重新傳了而已
b.網站升級對於js,css元素,一般可以改名,把css,js,推送到CDN。
網站不希望被緩存的內容
1)廣告圖片
2)網站流量統計工具
3)更新頻繁的文件(google的logo)
[root@linuxprobe ~]# cd /usr/local/nginx/logs/
日志優化的目的,是為了一天日志一壓縮,焚天存放,超過10天的刪除
創建日志切割腳本//每天日志分割腳本
[root@linuxprobe logs]# vim cut_nginx_log.sh#!/bin/bash#######################################function:cut nginx log files#author: shaon#######################################set the path to nginx log fileslog_files_path="/usr/local/nginx/logs"log_files_dir=${log_files_path}/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")log_files_dir=${log_files_path}/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")#set nginx log files you want to cutlog_files_name=(access error)#set the path to nginx.nginx_sbin="/usr/local/nginx/sbin/nginx"#Set how long you want to savesave_days=30#############################################Please do not modify the following script #############################################mkdir -p $log_files_dirlog_files_num=${#log_files_name[@]}#cut nginx log filesfor((i=0;i<$log_files_num;i++));domv ${log_files_path}/${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").logdone ays -exec rm -rf {}#delete 30 days ago nginx log filesfind $log_files_path -mtime +$save_days -exec rm -rf {} \;
健康檢查的日志,不輸入到log中,這些日志沒有意義,我們分析的話只需要分析訪問日志,看看一些頁面鏈接,如200,301,404的狀態嗎,在SEO中很重要,而且我們統計PV是頁面計算,這些都沒有意義,反而消耗了磁盤IO,降低了服務器性能,我們可以屏蔽這些如圖片,js,css這些不宜變化的內容
[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conflocation ~ .*\.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {access_log off;}
日志目錄權限優化
[root@linuxprobe ~]# chown -R root:root /usr/local/nginx/logs[root@linuxprobe ~]# chmod 700 /usr/local/nginx/logs
日志格式優化
#vim /usr/local/nginx/conf/nginx.conflog_format access ‘$remote_addr – $remote_user [$time_local] “$request” ‘‘$status $body_bytes_sent “$http_referer” ‘‘”$http_user_agent” $http_x_forwarded_for’;
其中,各個字段的含義如下:
1.$remote_addr 與$http_x_forwarded_for 用以記錄客戶端的ip地址;2.$remote_user : 用來記錄客戶端用戶名稱;3.$time_local : 用來記錄訪問時間與時區;4.$request : 用來記錄請求的url與http協議;5.$status : 用來記錄請求狀態;成功是200,6.$body_bytes_s ent :記錄發送給客戶端文件主體內容大小;7.$http_referer : 用來記錄從那個頁面鏈接訪問過來的;8.$http_user_agent : 記錄客戶端浏覽器的相關信息;
目錄文件訪問控制
主要用在禁止目錄下指定文件被訪問,當然也可以禁止所有文件被訪問!一般什麼情況下用?比如是有存儲共享,這些文件本來都只是一下資源文件,那麼這些資源文件就不允許被執行,如sh.py,pl,php等等
例如:禁止訪問images下面的php程序文件
location ~ ^/images/.*\.(php|php5|.sh|.py|.py)$ {deny all;}
[root@linuxprobe ~]# /usr/local/nginx/sbin/nginx -s reload[root@linuxprobe ~]# mkdir /usr/local/nginx/html/images[root@linuxprobe ~]# echo "" > /usr/local/nginx/html/images/index.php
測試訪問
多目錄組合配置方法
location ~ ^/images/(attachment|avatar)/.*\.(php|php5|.sh|.py|.py)$ {deny all;}
配置nginx禁止訪問*.txt文件
[root@linuxprobe ~]# echo "hello,linuxprobe" > /usr/local/nginx/html/test.txt
配置規則,禁止訪問
[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conf //server字段中location ~* \.(txt|doc)$ {if ( -f $request_filename) {root /usr/local/nginx/html;break;}deny all;}[root@linuxprobe ~]# /usr/local/nginx/sbin/nginx -s reload
當然,可以重定向到某一個URL
[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conflocation ~* \.(txt|doc)$ {if ( -f $request_filename) {root /usr/local/nginx/html;rewrite ^/(.*)$ http://www.linuxprobe.com last;break;}}
對目錄進行限制的方法
[root@linuxprobe ~]# mkdir -p /usr/local/nginx/html/{linuxprobe,1mcloud}[root@linuxprobe ~]# echo linuxprobe > /usr/local/nginx/html/linuxprobe/index.html[root@linuxprobe ~]# echo 1mcloud > /usr/local/nginx/html/1mcloud/index.html[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conflocation /linuxprobe/ { return 404 ; }location /1mcloud/ { return 403 ; }測試返回結果
上面是直接給了反饋的狀態嗎,也可以通過匹配deny all方式做
[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conflocation ~ ^/(linuxprobe)/ {deny all;}[root@linuxprobe ~]# /usr/local/nginx/sbin/nginx -s reload
來源訪問控制
這個需要ngx_http_access_module模塊支持,不過,默認會安裝
[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conf //寫法類似Apachelocation ~ ^/(linuxprobe)/ {allow 192.168.1.0/24;deny all;}
接著上面的實驗,就可以訪問了,下面是針對整個網站的寫法,對/限制就OK
location / {allow 192.168.1.0/24;deny all;}
當然可以寫IP,可以寫IP段,但是注意次序,上下匹配
同時,也可以通過if語句控制,給以友好的錯誤提示
if ( $remote_addr = 10.1.1.55 ) {return 404;}
#此處remote_addr地址為當前編輯文檔的系統ip地址
有時候,我們發現訪問網站的時候,使用IP也是可以得,我們可以把這一層給屏蔽掉,讓其直接反饋給403,也可以做跳轉
跳轉的做法:
server {listen 80 default_server;server_name _;rewrite ^ http://www.linuxprobe.com$request_uri?;}
403反饋的做法
server {listen 80 default_server;server_name _;return 403;}
301跳轉的做法
#如我們域名一般在解析的過程中,linuxprobe.com一般會跳轉到www.linuxprobe.com,記住修改本地hosts
server {listen 80;root /usr/share/nginx/html/;server_name www.linuxprobe.com linuxprobe.com;if ($host = 'a.com' ) {rewrite ^/(.*)$ www.linuxprobe.com/$1 permanent;}防盜鏈
防止別人直接從你網站引用圖片等鏈接,消耗了你的資源和網絡流量,那麼我們的解決辦法由幾種:
1:水印,品牌宣傳,你的帶寬,服務器足夠
2:防火牆,直接控制,前提是你知道IP來源
3:防盜鏈策略
下面的方法是直接給予404的錯誤提示
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {valid_referers none blocked *.linuxprobe,com linuxprobe.com;if ($invalid_referer) {return 404;}
同時,我們也可以設置一個獨有的,圖片比較小的,來做rewrite跳轉
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {valid_referers none blocked *.a.com a.com;if ($invalid_referer) {rewrite ^/ http://www.linuxprobe.com/img/nolink.png;}
錯誤頁面的提示
對於自定義的錯誤頁面,我們只需要將errorpage寫入到配置文件
error_page 404 /404.html;
內部身份驗證
[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conflocation /linuxprobe/ {auth_basic "haha";auth_basic_user_file /usr/local/nginx/conf/passwd;}
用戶創建
[root@linuxprobe ~]# yum -y install httpd-tools[root@linuxprobe ~]# htpasswd -cb /usr/local/nginx/conf/passwd linuxprobe 211212[root@linuxprobe ~]# chmod 400 /usr/local/nginx/conf/passwd[root@linuxprobe ~]# chown nginx /usr/local/nginx/conf/passwd[root@linuxprobe ~]# /usr/local/nginx/sbin/nginx -s reload防止DDOS攻擊
通過使用limit_conn_zone進行控制單個IP或者域名的訪問次數
[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conf
http字段中配置
limit_conn_zone $binary_remote_addr zone=addr:10m;
server的location字段配置
location / {root html;limit_conn addr 1;
#在其他機器上面進行並發測試
[root@linuxprobe ~]# webbench -c 5000 -t 120 http://10.1.1.83/linuxprobe/index.html
#webbench安裝請參考http://blog.sina.com.cn/s/blog_87113ac20102wag5.html
#nginx匹配符介紹
= 開頭表示精確匹配^~ 開頭表示uri以某個常規字符串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。~ 開頭表示區分大小寫的正則匹配~* 開頭表示不區分大小寫的正則匹配!~和!~* 分別為區分大小寫不匹配及不區分大小寫不匹配的正則/ 通用匹配,任何請求都會匹配到。多個location配置的情況下匹配順序為(參考資料而來,還未實際驗證,試試就知道了,不必拘泥,僅供參考):首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 / 通用匹配。當有匹配成功時候,停止匹配,按當前匹配規則處理請求。
本文原創地址:http://www.linuxprobe.com/nginx-config-optimization.html
http://xxxxxx/Linuxjc/1184711.html TechArticle