Nginx源碼安裝及調優配置

Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

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頭信息中的connection字段,防止回顯具體版本號

 

拓展:通用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

 

  • 定義了http錯誤碼的返回

 

有時候咱們頁面程序出現錯誤,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

Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

錯誤代碼測試(儘可能使用firefox或者類360瀏覽器)

Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置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相關進程,關係如圖:

Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

因此咱們能夠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

測試訪問
Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

多目錄組合配置方法

location ~ ^/images/(attachment|avatar)/.*\.(php|php5|.sh|.py|.py)$ {
deny all;
}

配置nginx禁止訪問*.txt文件

[root@linuxprobe ~]# echo "hello,linuxprobe" > /usr/local/nginx/html/test.txt

Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

配置規則,禁止訪問

[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

Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

固然,能夠重定向到某一個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 ; }
測試返回結果

Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置
Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

上面是直接給了反饋的狀態嗎,也能夠經過匹配deny all方式作

[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ ^/(linuxprobe)/ {
deny all;
}
[root@linuxprobe ~]# /usr/local/nginx/sbin/nginx -s reload

Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

來源訪問控制

這個須要ngx_http_access_module模塊支持,不過,默認會安裝

[root@linuxprobe ~]# vim /usr/local/nginx/conf/nginx.conf //寫法相似Apache
location ~ ^/(linuxprobe)/ {
allow 192.168.1.0/24;
deny all;
}

Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置
接着上面的實驗,就能夠訪問了,下面是針對整個網站的寫法,對/限制就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地址
Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

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

Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

防止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;

#在其餘機器上面進行併發測試
Nginx源碼安裝及調優配置Nginx源碼安裝及調優配置

[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/

相關文章
相關標籤/搜索