1. 程式人生 > 實用技巧 >nginx安裝以及優化

nginx安裝以及優化

安裝前優化(編譯前的優化主要是用來修改程式名等等,目的更改原始碼隱藏軟體名稱和版本號)

安裝 zlib-devel、pcre-devel 等依賴包

yum -y install gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel
下載 nginx 的原始碼包:http://nginx.org/download
tar zxf nginx-1.14.0.tar.gz
cd nginx-1.14.0
vim src/core/nginx.h
隱藏軟體名稱和版本號
#define NGINX_VERSION "1.10.2" //
第 13 行 //此行修改的是你想修改的軟體名稱 #define NGINX_VER "nginx/" NGINX_VERSION //第 14 行 修改上面的資訊,即可更改 nginx 顯示版本。例如:(curl –I 可看到,請求頭和響應頭顯示) #define NGINX_VERSION "7.0" #define NGINX_VER "IIS/" NGINX_VERSION 修改 HTTP 頭資訊中的 connection 欄位,防止回顯具體版本號 拓展:通用 http 頭 ,通用頭包含請求和響應訊息都支援的頭,通用頭包含 Cache-Control、 Connection、Date、Pragma、Transfer
-Encoding、Upgrade、Via。對通用頭的擴充套件要求通訊雙 方都支援此擴充套件,如果存在不支援的通用頭,一般將會作為實體頭處理。那麼也就是說有部 分裝置,或者是軟體,能獲取到 connection,部分不能,要隱藏就要徹底! vi src/http/ngx_http_header_filter_module.c 修改前: static char ngx_http_server_string[] = "Server: nginx" CRLF; //第 49 行 修改後: static char ngx_http_server_string[] = "Server: IIS" CRLF; 定義了 http 錯誤碼的返回: 有時候我們頁面程式出現錯誤,Nginx 會代我們返回相應的錯誤程式碼,回顯的時候,會帶上 nginx 和版本號,我們把他隱藏起來
vi src/http/ngx_http_special_response.c 修改前 static u_char ngx_http_error_tail[] = //第 29 行 "<hr><center>nginx</center>" CRLF "</body>" CRLF "</html>" CRLF ; 修改後 static u_char ngx_http_error_tail[] = "<hr><center>caoyi</center>" CRLF "</body>" CRLF "</html>" CRLF

安裝 ngnix

groupadd caoyi    ##建立組命名為caoyi
useradd caoyi       ##建立使用者caoyi,並且將caoyi使用者新增到caoyi組
useradd -g caoyi caoyi -s /sbin/nologin     不允許caoyi使用者直接登入系統

確認好依賴安裝完成以後進行編譯安裝nginx

./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 --with-http_ssl_module --with-http_gzip_static_module --user=caoyi --group=caoyi
make&&make install

編譯安裝模組選項說明

--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-http_ssl_module #啟用 ngx_http_ssl_module
如果 pcre 是通過編譯安裝的話,例如
# tar zxvf /usr/local/src/pcre-8.36.tar.gz -C /usr/local/src/
# cd /usr/local/src/pcre-8.36
# ./configure && make && make install
則--with-pcre=/usr/local/src/pcre-8.36 #需要注意,這裡指的是原始碼,用#./configure --help
|grep pcre 檢視幫助

建立軟連線

[root@localhost nginx-1.14.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

模擬啟動檢測是否安裝正確

[root@localhost nginx-1.14.0]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

啟動nginx,並且檢視程序是否啟動

[root@localhost nginx-1.14.0]# nginx
[root@localhost nginx-1.14.0]# ss -anput |grep 80
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=21864,fd=6),("nginx",pid=21863,fd=6))

測試是否隱藏了版本和軟體名

[root@localhost nginx-1.14.0]# curl -I http://127.0.0.1
HTTP/1.1 200 OK
Server: cxk/10.8.8
Date: Sun, 16 Aug 2020 03:25:52 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sun, 16 Aug 2020 03:14:43 GMT
Connection: keep-alive
ETag: "5f38a4a3-264"
Accept-Ranges: bytes

nginx常用選項

[root@localhost nginx-1.14.0]# nginx -h
nginx version: cxk/10.8.8
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
-?,-h     : 開啟幫助資訊
-v : 顯示版本資訊並退出
-V : 顯示版本和配置選項資訊,然後退出
-t : 檢測配置檔案是否有語法錯誤,然後退出
-q : 在檢測配置檔案期間遮蔽非錯誤資訊
-s signal : 給一個 nginx 主程序傳送訊號:stop(強制停止), quit(優雅退出), reopen(重啟), reload(重新載入配置檔案)
-p prefix : 設定字首路徑(預設是:/usr/share/nginx/)
-c filename : 設定配置檔案(預設是:/etc/nginx/nginx.conf)
-g directives : 設定配置檔案外的全域性指令

nginx #開啟 nginx
nginx -t #測試配置檔案是否有語法錯誤
nginx -s reopen #重啟Nginx
nginx -s reload #重新載入Nginx配置檔案,然後以優雅的方式重啟Nginx
nginx -s stop #強制停止Nginx服務
nginx -s quit #優雅地停止Nginx服務(即處理完所有請求後再停止服務)

nginx 配置項優化

[root@localhost nginx-1.14.0]# ps -ef |grep nginx
root      21863      1  0 11:20 ?        00:00:00 nginx: master process nginx
caoyi     21864  21863  0 11:20 ?        00:00:00 nginx: worker process

在這裡我們還可以看到在檢視的時候,work 程序是 nginx 程式使用者,但是 master 程序還是
root,其中,master 是監控程序,也叫主程序,work 是工作程序,部分還有 cache 相關程序,
關係如圖:

可以直接理解為 master 是管理員,work 程序才是為使用者提供服務的!

(1):Nginx 執行工作程序個數,一般我們設定 CPU 的核心或者核心數 x2

vim /usr/local/nginx/conf/nginx.conf
worker_processes 4;
nginx -s reload
grep ^worker_processes /usr/local/nginx/conf/nginx.conf
worker_processes  4;
[root@localhost nginx-1.14.0]# ps -aux |grep nginx
root      21863  0.0  0.1  46124  1960 ?        Ss   11:20   0:00 nginx: master process nginx
caoyi     38911  0.0  0.1  46556  2028 ?        S    12:25   0:00 nginx: worker process
caoyi     38912  0.0  0.1  46556  2028 ?        S    12:25   0:00 nginx: worker process
caoyi     38913  0.0  0.1  46556  2028 ?        S    12:25   0:00 nginx: worker process
caoyi     38914  0.0  0.1  46556  2028 ?        S    12:25   0:00 nginx: worker process
root      38921  0.0  0.0 112724   984 pts/0    S+   12:26   0:00 grep --color=auto nginx

可以看出工作程序數現在變成了4個,這個是根據伺服器cpu核心數進行修改

Nginx 執行 CPU 親和力

比如 4 核配置
worker_processes 4;

比如 8 核配置
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000
10000000;
worker_processes 最多開啟 8 個,8 個以上效能提升不會再提升了,而且穩定性變得更低,
所以 8 個程序夠用了。

Nginx 最多可以開啟檔案數 ##預設是1024

worker_rlimit_nofile 65535;

這個引數是指當一個nginx程序可以開啟最多的檔案個數,

理論值應該是最多開啟檔案數
(ulimit -n)與 nginx 程序數相除,但是 nginx 分配請求並不是那麼均勻,所以最好與 ulimit -n
的值保持一致。

[root@localhost nginx-1.14.0]# ulimit -n
65535

檔案資源限制的配置可以在/etc/security/limits.conf 設定,針對 root/user 等各個使用者或者*
代表所有使用者來設定。

使用者重新登入生效(ulimit -n)

(2)Nginx 事件處理模型

nginx 採用 epoll 事件模型,處理效率高
work_connections 是單個 worker 程序允許客戶端最大連線數,這個數值一般根據伺服器性
能和記憶體來制定,實際最大值就是 worker 程序數乘以 work_connections
實際我們填入一個 65535,足夠了,這些都算併發值,一個網站的併發達到這麼大的數量,
也算一個大站了!

multi_accept :告訴 nginx 收到一個新連線通知後接受盡可能多的連線

[root@localhost nginx-1.14.0]# grep -A 5 ^events /usr/local/nginx/conf/nginx.conf 
events {
    use epoll;
    worker_connections  65535;
    multi_accept on;
}

(3)開啟高效傳輸模式

[root@localhost nginx-1.14.0]# grep -A 11 ^http  /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;

Include mime.types; //媒體型別, include 只是一個在當前檔案中包含另一個檔案內容的指令

default_type application/octet-stream; //預設媒體型別足夠

sendfile on; //開啟高效檔案傳輸模式,sendfile 指令指定 nginx 是否呼叫 sendfile 函式來
輸出檔案,對於普通應用設為 on,如果用來進行下載等應用磁碟 IO 重負載應用,可設定為
off,以平衡磁碟與網路 I/O 處理速度,降低系統的負載。

注意:如果圖片顯示不正常把這個改成 off。

tcp_nopush on;

必須在 sendfile 開啟模式才有效,防止網路阻塞,積極的減少網路報文
段的數量(告訴 nginx 在一個數據包裡傳送所有標頭檔案,而不一個接一個的傳送。)

(4)連線超時時間(以下配置必須放在http{下才會生效,不然會報錯)

主要目的是保護伺服器資源,CPU,記憶體,控制連線數,因為建立連線也是需要消耗資源的

keepalive_timeout 60; 
tcp_nodelay on;       
client_header_buffer_size 4k; 
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timedout_connection on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;

keepalived_timeout 客戶端連線保持會話超時時間,超過這個時間,伺服器斷開這個連結
tcp_nodelay;也是防止網路阻塞,不過要包涵在 keepalived 引數才有效
client_header_buffer_size 4k;
客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設定,一般一個請求頭的
大小不會超過 1k,不過由於一般系統分頁都要大於 1k,所以這裡設定為分頁大小。分頁大
小可以用命令 getconf PAGESIZE 取得。
open_file_cache max=102400 inactive=20s;
這個將為開啟檔案指定快取,預設是沒有啟用的,max 指定快取數量,建議和開啟檔案
數一致,inactive 是指經過多長時間檔案沒被請求後刪除快取。
open_file_cache_valid 30s;
這個是指多長時間檢查一次快取的有效資訊。
open_file_cache_min_uses 1;
open_file_cache 指令中的 inactive 引數時間內檔案的最少使用次數,如果超過這個數字,文
件描述符一直是在快取中開啟的,如上例,如果有一個檔案在 inactive 時間內一次沒被使用,
它將被移除。
client_header_timeout 設定請求頭的超時時間。我們也可以把這個設定低些,如果超過這個
時間沒有傳送任何資料,nginx 將返回 request time out 的錯誤
client_body_timeout 設定請求體的超時時間。我們也可以把這個設定低些,超過這個時間沒
有傳送任何資料,和上面一樣的錯誤提示
reset_timeout_connection 告訴 nginx 關閉不響應的客戶端連線。這將會釋放那個客戶端所
佔有的記憶體空間。
send_timeout 響應客戶端超時時間,這個超時時間僅限於兩個活動之間的時間,如果超過
這個時間,客戶端沒有任何活動,nginx 關閉連線
server_tokens 並不會讓 nginx 執行的速度更快,但它可以關閉在錯誤頁面中的 nginx 版本
數字,這樣對於安全性是有好處的。
client_max_body_size 上傳檔案大小限制

(5)fastcgi 調優

fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path /usr/local/nginx1.10/nginx_tmp;
fastcgi_intercept_errors on;
fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m
inactive=1d max_size=10g;

Cache: 寫入快取區
Buffer: 讀取快取區
Fastcgi 是靜態服務和動態服務的一個介面
fastcgi_connect_timeout 600; #指定連線到後端 FastCGI 的超時時間。
fastcgi_send_timeout 600; #向 FastCGI 傳送請求的超時時間。
fastcgi_read_timeout 600; #指定接收 FastCGI 應答的超時時間。
fastcgi_buffer_size 64k; #指定讀取 FastCGI 應答第一部分需要用多大的緩衝區,預設的緩衝區
大小為 fastcgi_buffers 指令中的每塊大小,可以將這個值設定更小。
fastcgi_buffers 4 64k; #指定本地需要用多少和多大的緩衝區來緩衝 FastCGI 的應答請求,如果
一個 php 指令碼所產生的頁面大小為 256KB,那麼會分配 4 個 64KB 的緩衝區來快取,如果頁
面大小大於 256KB,那麼大於 256KB 的部分會快取到 fastcgi_temp_path 指定的路徑中,但是
這並不是好方法,因為記憶體中的資料處理速度要快於磁碟。一般這個值應該為站點中 php
指令碼所產生的頁面大小的中間值,如果站點大部分指令碼所產生的頁面大小為 256KB,那麼可
以把這個值設定為“8 32K”、“4 64k”等。
fastcgi_busy_buffers_size 128k; #建議設定為 fastcgi_buffers 的兩倍,繁忙時候的 buffer
fastcgi_temp_file_write_size 128k; #在寫入 fastcgi_temp_path 時將用多大的資料塊,預設
值是 fastcgi_buffers 的兩倍,該數值設定小時若負載上來時可能報 502 Bad Gateway
fastcgi_temp_path #快取臨時目錄
fastcgi_intercept_errors on;# 這個指令指定是否傳遞 4xx 和 5xx 錯誤資訊到客戶端,或者允許
nginx 使用 error_page 處理錯誤資訊。
注:靜態檔案不存在會返回 404 頁面,但是 php 頁面則返回空白頁!!
fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m
inactive=1d max_size=10g; # fastcgi_cache 快取目錄,可以設定目錄層級,比如 1:2 會生成
16*256 個子目錄,cache_fastcgi 是這個快取空間的名字,cache 是用多少記憶體(這樣熱門的
內容 nginx 直接放記憶體,提高訪問速度),inactive 表示預設失效時間,如果快取資料在失效
時間內沒有被訪問,將被刪除,max_size 表示最多用多少硬碟空間。
fastcgi_cache cache_fastcgi; #表示開啟 FastCGI 快取併為其指定一個名稱。開啟快取非常有
用,可以有效降低 CPU 的負載,並且防止 502 的錯誤放生。cache_fastcgi 為 proxy_cache_path
指令建立的快取區名稱
fastcgi_cache_valid 200 302 1h; #用來指定應答程式碼的快取時間,例項中的值表示將 200 和
302 應答快取一小時,要和 fastcgi_cache 配合使用
fastcgi_cache_valid 301 1d; #將 301 應答快取一天
fastcgi_cache_valid any 1m; #將其他應答快取為 1 分鐘
fastcgi_cache_min_uses 1; #該指令用於設定經過多少次請求的相同 URL 將被快取。
fastcgi_cache_key http://$host$request_uri; #該指令用來設定web快取的Key值,nginx根據Key
值 md5 哈 希 存 儲 . 一 般 根 據 $host( 域 名 ) 、 $request_uri( 請 求 的 路 徑 ) 等 變 量 組 合 成
proxy_cache_key 。
fastcgi_pass #指定 FastCGI 伺服器監聽埠與地址,可以是本機或者其它
總結:
nginx 的快取功能有:proxy_cache / fastcgi_cache
proxy_cache 的作用是快取後端伺服器的內容,可能是任何內容,包括靜態的和動態。
fastcgi_cache 的作用是快取 fastcgi 生成的內容,很多情況是 php 生成的動態的內容。
proxy_cache 快取減少了 nginx 與後端通訊的次數,節省了傳輸時間和後端寬頻。
fastcgi_cache 快取減少了 nginx 與 php 的通訊的次數,更減輕了 php 和資料庫(mysql)的壓力。

(6)gzip 調優

使用 gzip 壓縮功能,可能為我們節約頻寬,加快傳輸速度,有更好的體驗,也為我們節約
成本,所以說這是一個重點。

Nginx 啟用壓縮功能需要你來 ngx_http_gzip_module 模組,apache 使用的是 mod_deflate
一般我們需要壓縮的內容有:文字,js,html,css,對於圖片,視訊,flash 什麼的不壓縮,
同時也要注意,我們使用 gzip 的功能是需要消耗 CPU 的!

    gzip  on;
    gzip_min_length 2k;
    gzip_buffers 4 32k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;
    gzip_proxied any;

gzip on; #開啟壓縮功能

gzip_min_length 1k; #設定允許壓縮的頁面最小位元組數,頁面位元組數從 header 頭的
Content-Length 中獲取,預設值是 0,不管頁面多大都進行壓縮,建議設定成大於 1K,如果
小與 1K 可能會越壓越大。

gzip_buffers 4 32k; #壓縮緩衝區大小,表示申請 4 個單位為32K 的記憶體作為壓縮結果流快取,
預設值是申請與原始資料大小相同的記憶體空間來儲存 gzip 壓縮結果。

gzip_http_version 1.1; #壓縮版本,用於設定識別 HTTP 協議版本,預設是 1.1,目前大部分瀏
覽器已經支援 GZIP 解壓,使用預設即可

gzip_comp_level 6; #壓縮比例,用來指定 GZIP 壓縮比,1 壓縮比最小,處理速度最快,9 壓
縮比最大,傳輸速度快,但是處理慢,也比較消耗 CPU 資源。

gzip_types text/css text/xml application/javascript; #用來指定壓縮的型別,‘text/html’型別總是
會被壓縮。

預設值: gzip_types text/html (預設不對 js/css 檔案進行壓縮)

# 壓縮型別,匹配 MIME 型別進行壓縮
# 不能用萬用字元 text/*
# (無論是否指定)text/html 預設已經壓縮
# 設定哪壓縮種文字檔案可參考 conf/mime.types

gzip_vary on; #vary header 支援,改選項可以讓前端的快取伺服器快取經過 GZIP 壓縮的頁
面,例如用 Squid 快取經過 nginx 壓縮的資料