Nginx編譯前的優化javascript
[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/
編譯前的優化主要是用來修改程序名等等,例如:php
[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.com HTTP/1.1 200 OK Server: nginx/1.10.1 #咱們目標是將nginx更更名字 Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.6.29 Set-Cookie: PHPSESSID=smm0i6u4f9v7bj0gove79ja1g7; path=/ Cache-Control: no-cache Date: Mon, 07 Seq 2016 06:09:11 GMT
[root@linuxprobe nginx-1.10.1]# vim src/core/nginx.h
#define NGINX_VERSION "nginx_stable" #此行修改的是你想要的版本號css
#define NGINX_VER "linuxprobe/" NGINX_VERSION #此行修改的是你想修改的軟件名稱html
[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,部分不能,要隱藏就要完全!java
static char ngx_http_server_string[] = "Server: LinuxprobeWeb" CRLF;node
[root@linuxprobe nginx-1.10.1]# vim +29 src/http/ngx_http_special_response.c
有時候咱們頁面程序出現錯誤,Nginx會代咱們返回相應的錯誤代碼,回顯的時候,會帶上nginx和版本號,咱們把他隱藏起來linux
static u_char ngx_http_error_full_tail[] = "<hr><center>" NGINX_VER "</center>" CRLF "</body>" CRLF "</html>" CRLF ;
修改後nginx
static u_char ngx_http_error_tail[] = "<hr><center>LinuxprobeWeb</center>" CRLF "</body>" CRLF "</html>" CRLF ;
Nginx正式安裝c++
一鍵安裝相關依賴包
[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 nginx tcp 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.conf user nginx; [root@linuxprobe ~]# /usr/local/nginx/sbin/nginx -s reload [root@linuxprobe ~]# ps -aux | grep nginx nginx 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.conf worker_processes 2; [root@linuxprobe ~]# /usr/local/nginx/sbin/nginx -s reload [root@linuxprobe ~]# ps -axu | grep nginx nginx 52686 0.0 0.1 22668 1300 ? S 15:10 0:00 nginx: worker process nginx 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.conf worker_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的兩倍,繁忙時候的buffer fastcgi_temp_file_write_size 128k; #在寫入fastcgi_temp_path時將用多大的數據庫,默認值是fastcgi_buffers的兩倍,設置上述數值設置小時若負載上來時可能報502Bad Gateway fastcgi_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:2 keys_zone=ngx_fcgi_cache:512m inactive=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 files log_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 cut log_files_name=(access error) #set the path to nginx. nginx_sbin="/usr/local/nginx/sbin/nginx" #Set how long you want to save save_days=30 ############################################ #Please do not modify the following script # ############################################ mkdir -p $log_files_dir log_files_num=${#log_files_name[@]} #cut nginx log files for((i=0;i<$log_files_num;i++));do mv ${log_files_path}/${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log done ays -exec rm -rf {} #delete 30 days ago nginx log files find $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.conf location ~ .*\.(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.conf log_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.conf location ~* \.(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.conf location /linuxprobe/ { return 404 ; } location /1mcloud/ { return 403 ; } 測試返回結果
上面是直接給了反饋的狀態嗎,也能夠經過匹配deny all方式作
[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conf location ~ ^/(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 //寫法相似Apache location ~ ^/(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和301優化
有時候,咱們發現訪問網站的時候,使用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.conf location /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配置的狀況下匹配順序爲(參考資料而來,還未實際驗證,試試就知道了,沒必要拘泥,僅供參考): 首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 / 通用匹配。當有匹配成功時候,中止匹配,按當前匹配規則處理請求。
免費提供最新Linux技術教程書籍,爲開源技術愛好者努力作得更多更好:http://www.linuxprobe.com/