天天看點

LNMP架構的nginx性能優化

文章目錄

      • lnmp
        • 重新編譯nginx添加子產品
      • nginx并發優化
        • 設定cpu與work綁定
        • 設定work連接配接數
        • TCP連接配接限制
        • TCP偵聽隊列
        • TCP timewait 回收和重用
        • 平滑更新與復原
      • nginx子產品
        • status 子產品
        • http_ssl 子產品
        • http_conn 子產品
        • 限制機關時間内的通路量
        • expireh緩存
        • ip控制
        • 站點目錄檔案的通路限制
        • nginx重定向
        • 防盜鍊

lnmp

Linux (基于linux)

Nginx(請求轉發,反向代理,處理靜态資源)

Mysql (存儲資料)

Php(處理動态語言)

重新編譯nginx添加子產品

進入之前編譯的目錄

如果要删掉之前的版本 直接rm -fr /usr/local/nginx

修改systemd配置檔案

LNMP架構的nginx性能優化

systemctl daemon-reload

LNMP架構的nginx性能優化

指定使用者群組

LNMP架構的nginx性能優化

nginx.conf

LNMP架構的nginx性能優化

nginx并發優化

設定cpu與work綁定

開啟四個work

LNMP架構的nginx性能優化

ab -c1 -n100000 壓力測試 top 1 監控cpu狀況

LNMP架構的nginx性能優化

實際上cpu在不斷切換 會造成上下文切換 産生浪費

LNMP架構的nginx性能優化

0001 是第一個cpu的意思 0010是第二個cpu的意思 以此類推

LNMP架構的nginx性能優化

cpu綁定更适用于高并發情況

設定work連接配接數

一般生産環境一個work至少連接配接65535

檢視程序限制

LNMP架構的nginx性能優化

配置檔案加入

worker_rlimit_nofile 65535;

LNMP架構的nginx性能優化
LNMP架構的nginx性能優化

修改作業系統限制 /etc/security/limits.conf (nginx是我們之前添加的使用者)

LNMP架構的nginx性能優化

這是核心限制與硬體有關 記憶體越大數值越大

LNMP架構的nginx性能優化

TCP連接配接限制

臨時修改

[[email protected] ~]# sysctl  net.ipv4.ip_local_port_range ###檢視限制
net.ipv4.ip_local_port_range = 1024     65535
[[email protected] ~]# sysctl -w net.ipv4.ip_local_port_range="1024 65535" ### 修改限制
net.ipv4.ip_local_port_range = 1024 65535
           

永久修改

可以編輯兩個檔案/etc/sysctl.conf /etc/sysctl.d/nginx.conf

添加配置:

net.ipv4.ip_local_port_range= 1024 65535

sysctl --system

LNMP架構的nginx性能優化

TCP偵聽隊列

[[email protected] ~]# sysctl net.core.somaxconn
net.core.somaxconn = 128
           

同樣有臨時修改和永久修改

臨時:

sysctl -w net.core.somaxconn=1024

永久:

編輯/etc/sysctl.d/nginx.conf

net.core.somaxconn=1024

sysctl --system

LNMP架構的nginx性能優化

TCP timewait 回收和重用

net.ipv4.ip_local_port_range= 1024 65535
net.core.somaxconn = 2048
net.ipv4.tcp_tw_recycle = 1 ##回收
net.ipv4.tcp_tw_reuse = 1  ##重用
           
LNMP架構的nginx性能優化

#### 日志截斷

[[email protected] ~]# ll /usr/local/lnmp/nginx/logs/
total 20516
-rw-r--r-- 1 root root 21000105 Aug 14 13:05 access.log ##通路日志
-rw-r--r-- 1 root root      708 Aug 14 13:20 error.log  ## 報錯日志
-rw-r--r-- 1 root root        5 Aug 14 13:20 nginx.pid
[[email protected] ~]# du -sh /usr/local/lnmp/nginx/logs/
21M     /usr/local/lnmp/nginx/logs/
           

通常在通路量比較大的伺服器上日志往往有幾十個G 管理日志不友善

解決方法: 通過crontab每天對日志進行截斷

  • 編寫截斷腳本 /opt/nginx_log.sh
[[email protected] conf]# cat /opt/nginx_log.sh 
#! /bin/bash
cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log
/usr/local/nginx/sbin/nginx -s reload
[[email protected] conf]# crontab -l
00 00 * * * /opt/nginx_log.sh &> /dev/null
[[email protected] conf]# chmod -R 700 /usr/local/lnmp/nginx/logs/ ##日志目錄不需要給使用者權限
           

腳本每天在0:00 重命名日志檔案 為accss_2020-08-13.log

LNMP架構的nginx性能優化

平滑更新與復原

現在要把nginx更新為1.19版本 要求是不能中斷服務(master的程序号必須存在)

LNMP架構的nginx性能優化

先執行configure和make 注意configure選項不變 不能make install 因為會覆寫源程式

在make完成後 将原有的nginx做備份 使用cp -f 強制覆寫原有的nginx

整個過程保證原nginx程序master存在

LNMP架構的nginx性能優化

現在要讓新nginx工作舊的nginx不處理服務

LNMP架構的nginx性能優化

這是就完成了版本的平滑更新 如果新版本穩定可用 可以完全退出舊版本使用kill -QUIT

假設新版本不穩定 我們要退回舊版本

cp -f nginx.old nginx 還原nginx程式

kill -HUP 原程序id 喚醒原程式

kill -WINCH 新版本程序id 關閉新版本的worker程序

LNMP架構的nginx性能優化

模拟測試 在server2 壓力測試 server1上 更新nginx

LNMP架構的nginx性能優化

版本号和程序id都發生變化 但請求全部處理

nginx子產品

status 子產品

要在configure加入–with-http_stub_status_module

LNMP架構的nginx性能優化
LNMP架構的nginx性能優化

http_ssl 子產品

配置檔案

LNMP架構的nginx性能優化
LNMP架構的nginx性能優化

效果:

點選進階 繼續前往

LNMP架構的nginx性能優化
LNMP架構的nginx性能優化

http_conn 子產品

官方文檔 給出的大緻結構

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    ...

    server {

        ...

        location /download/ {
            limit_conn addr 1;
        }
           

效果:

LNMP架構的nginx性能優化

可以看到503

LNMP架構的nginx性能優化

如果一個使用者 ab -c1 -n1000 http://172.25.254.101/download/nginx-1.18.0.tar.gz

LNMP架構的nginx性能優化

還可以加入 limlt_rate 選項控制下載下傳速度

location /download/ {
           autoindex on; ###資源自動索引
           limit_conn addr 1;
           limit_rate 10k; ##限制速度10k
        }
           
LNMP架構的nginx性能優化

限制機關時間内的通路量

官方文檔

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ##在http塊加入這句
location / {
            root   html;
            index  index.html index.htm;
            limit_req zone=one;
        }
           
LNMP架構的nginx性能優化

加入排隊機制

location / {
            root   html;
            index  index.html index.htm;
            limit_req zone=one burst=5 nodelay; ##排隊隊列為5 無延時
        }
           

10 - 5 -1 = 4

LNMP架構的nginx性能優化

expireh緩存

location /download/ {
           autoindex on;
           #limit_conn addr 1;
           #limit_rate 10k;
        location ~ .*\.(gif|png|jpg)$ {
           expires 365d;
        }
        }
           
LNMP架構的nginx性能優化

ip控制

50         location /status {
 51             stub_status;
 52             access_log off;
 53             allow 172.25.254.100;
 54             deny all;
 55         }
           
LNMP架構的nginx性能優化
LNMP架構的nginx性能優化

站點目錄檔案的通路限制

例如一些腳本檔案是不能被使用者通路的

54         location /download/ {
 55             autoindex on;
 56             #limit_conn addr 1;
 57             #limit_rate 10k;
 58             #location ~ .*\.(gif|png|jpg)$ {
 59             #   expires 365d;
 60             #}
 61             location ~ .*\.(sh|php)$ {
 62                 deny all;
 63             }
           
LNMP架構的nginx性能優化

nginx重定向

LNMP架構的nginx性能優化

如果是以ip來通路 傳回500的錯誤 防止域名惡意解析到ip

LNMP架構的nginx性能優化

也可以重定向

38     server {
 39         listen       80;
 40         server_name  _;
 41         rewrite ^(.*) http://www.westos.org permanent;
           
LNMP架構的nginx性能優化

80 重定向到 443

102     server {
103         listen       80;
104         #listen       somename:8080;
105         #server_name  somename  alias  another.alias;
106         server_name www.westos.org;
107         rewrite ^/(.*)$ https://www.westos.org/$1 permanent; ##$1是後面的url
108         #location / {
109         #    root   html;
110         #    index  index.html index.htm;
111         #}
112     }
           
LNMP架構的nginx性能優化

假如使用者通路www.westos.org/bbs 重定向到bbs.westos.org

LNMP架構的nginx性能優化
LNMP架構的nginx性能優化

重定向到主站

102     server {
103         listen       80;
104         #listen       somename:8080;
105         #server_name  somename  alias  another.alias;
106         server_name www.westos.org bbs.westos.org;
107         #rewrite ^/bbs$ http://bbs.westos.org permanent;
108         #rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;
109         #rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
110         if ($host = "bbs.westos.org"){
111         rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent;
112         }
113         #location / {
114         #    root   html;
115         #    index  index.html index.htm;
116         #}
117     }
           
LNMP架構的nginx性能優化

防盜鍊

盜鍊是指服務提供商自己不提供服務的内容,通過技術手段繞過其它有利益的最終使用者界面(如廣告),直接在自己的網站上向最終使用者提供其它服務提供商的服務内容,騙取最終使用者的浏覽和點選率。受益者不提供資源或提供很少的資源,而真正的服務提供商卻得不到任何的收益。

server2 index.html

<!DOCTYPE html>
<html>
<body>
<img src="http://www.westos.org/download/1.jpg">
</body>
</html>       
           

使用了server1的資源 但沒有任何代價

LNMP架構的nginx性能優化

在server1上配置

102     server {
103         listen       80;
104         #listen       somename:8080;
105         #server_name  somename  alias  another.alias;
106         server_name www.westos.org bbs.westos.org;
107         #rewrite ^/bbs$ http://bbs.westos.org permanent;
108         #rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;
109         #rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
110         if ($host = "bbs.westos.org"){
111         rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent;
112         }
113         valid_referers none blocked www.westos.org;  ##正常通路不處理
114         if ($invalid_referer) {
115             return 403;				## 異常通路傳回403
116         }
117         #location / {
118         #    root   html;
119         #    index  index.html index.htm;
120         #}
121     }
           

要提前清除浏覽器緩存

LNMP架構的nginx性能優化

也可以重定向到其他頁面

114         if ($invalid_referer) {
115             #return 403;
116             rewrite ^/ http://bbs.westos.org/daolian.jpg;
117         }     
           
LNMP架構的nginx性能優化