運維實戰 Nginx配置優化
- Nginx并發優化
- Nginx平滑升級
- Nginx限流
- 控制單IP并發連接數
- 限制單位時間內的請求數目和速度
- Nginx配置管理
- 自動索引
- Nginx Expire快取配置
- 日志輪詢
- IP訪問限制
- 禁用不必要的日志記錄,節約磁盤IO的消耗
- 站點目錄和檔案的限制
- 解決中文亂碼問題
- Nginx重定向
- 防盜鏈
- Goaccess 日志可視化
- 軟體安裝
- 簡單使用
Nginx并發優化
##修改worker行程數提高并發
##修改CPU使用情況,也可以使用auto
worker_processes 2;
worker_cpu_affinity 01 10;
##單個作業行程并發連接數
worker_connections
nginx作為http服務器時:
max_clients = worker_processes * worker_connections
nginx作為反向代理服務器時:
max_clients = worker_processes * worker_connections/2
##使用epoll模型
use epoll;
##開啟檔案高效傳輸模式
##同時設定tcp_nopush和tcp_nodelay為on
##可以防止網路和磁盤IO阻塞
sendfile on;
tcp_nopush on;
tcp_nodelay on;
##修改用戶行程打開檔案數限制
/etc/security/limits.conf
nginx - nofile 65535
##Linux系統級的最大打開檔案數限制
##需要注意的是這一條設定與計算機的物理記憶體有關,不能隨便設定
fs.file-max = 188414
##修改網路內核對TCP連接的有關限制
net.ipv4.ip_local_port_range = 1024 65535
##限制接收新TCP連接偵聽佇列的大小
net.core.somaxconn = 2048
##啟用tcp連接timewait快速回收和重用
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
NGINX為什么比apache快
涉及五種IO復用,可以自行查看.
Nginx平滑升級
首先需要明確的概念:
雖然之前我們有使用過systemctl reload nginx等功能.
但實際上reload也是需要時間多載的,雖然更短但依舊需要時間.
所以能夠進行平滑升級的情況下自然還是平滑升級更好.
-
下載nginx新版本軟體 正確執行
./configure和make, 但并不進行make install -
備份原程式
cd /usr/local/lnmp/nginx/sbin
cp nginx nginx.old
- 拷貝新程式:
cd nginx-1.19.1/objs
cp -f nginx /usr/local/lnmp/nginx
- 運行新的二進制檔案并查看行程狀態
nginx
ps ax | grep nginx
##正常情況下新舊版本應該都可以看到
- 關閉舊版本
kill -USR2 3216
kill -WINCH 3216
運行-USR2時舊的Nginx主行程將會把自己的行程檔案改名為.oldbin, 然后執行新版 Nginx. 新舊Nginx會同市運行, 共同處理請求
而運行-WINCH后舊的作業行程就都會隨著任務執行完畢而退出, 新版的Nginx的作業行程會逐漸取代舊版作業行程.
需要注意的是,這時主行程依舊會保留,方便進行回滾等操作
- 回滾時的方法
kill -HUP 3216
kill -WINCH [新行程號]
kill -9 [新行程號]
額外的優化點
軟體升級除了增加新功能以外很多時候是在修復bug
舊版本的bug可能會被人利用而危害到作業環境
因此對訪問/嗅探隱藏版本號也算一個優化點
Nginx限流
控制單IP并發連接數
vim /usr/local/nginx/conf/nginx.conf
http {
upstream linux {
sticky;
server 172.25.5.1:80;
server 172.25.5.1:80;
}
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /dowload/ {
limit_conn addr 1;
limit_rate 50k;
}
}
上文中的做法:
$binary_remote_addr表示通過remote_addr這個標識來做限制
zone=addr:10m表示生成一個大小為10M,名字為addr的記憶體區域
limit_conn addr限制并發數,這里限制并發數為1
limit_rate限制帶寬,這里為50K
限制單位時間內的請求數目和速度
##rate=1r/s表示允許相同標識的客戶端的訪問頻次,這里限制的是每秒1次
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
}
server {
location / {
limit_req zone=one;
#limit_req zone=one burst=5
#limit_req zone=one burst=5 nodelay;
}
}
Nginx配置管理
自動索引
當打開服務器中存在的目錄時自動生成目錄下檔案索引并顯示,方便下載和瀏覽
location / {
autoindex on;
}
Nginx Expire快取配置
對于靜態檔案而言,使用快取可以明顯降低網站帶寬,起到加速用戶訪問的效果
##對于html路徑下的所有圖片作快取,保存365天
location ~ .*\.(gif|jpg|png)$ {
expires 365d;
root /html;
}
日志輪詢
對于業務環境而言,對于Nginx的訪問量是巨大的,因此創建的日志所占用的磁盤空間也是巨大的.
定時進行日志輪詢和持久花存盤可以對日志的存盤和查看起到一定的幫助.
##撰寫日志輪詢備份的腳本
vim nginxlog.sh
#!/bin/bash
cd /usrlocal/nginx/logs && mv access.log access_$(date + %F -d -1days).log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
實際上干了兩件事:
- 將當前日志重命名為昨天的日志,
$(date + %F -d -1days)的含義就是這樣 - 重新創建日志檔案
##設定定時任務
##實作每天午夜12點備份昨天的日志
chmod +x /mnt/nginxlog.sh
00 00 * * * /mnt/nginxlog.sh &> /dev/null
##安全起見,不給予日志目錄過高的訪問權限
chmod -R 700 /usr/local/nginx/logs
IP訪問限制
location / {
deny 172.25.5.2;
allow 172.25.5.250;
deny all;
}
if ($remote_addr = 172.25.5.254) {
return 403;
}
##兩端代碼的意思分別為
阻止172.25.5.2訪問,允許172.25.5.250訪問
阻止其他所有IP訪問
如果訪問IP為172.25.5.254,回傳403頁面
禁用不必要的日志記錄,節約磁盤IO的消耗
location ~ .*\.(js|jpg|jpeg|png|css|bmp|gif)$ {
access_log off
}
##就如同寫的一樣,當請求為后續這些檔案格式結尾時,不記錄日志
站點目錄和檔案的限制
location ~ ^/images/.*\.(sh|php)$ {
deny all;
}
##訪問image目錄下的sh/PHP等可執行檔案時拒絕,為了避免注入運行的攻擊手段
##當然,同樣的語法也可以用來做權限控制
location ~ ^/images/.*\.(sh|php)$ {
allow 172.25.5.250;
deny all;
}
##這樣就實作了宿主機(172.25.5.250)可以運行images目錄下的sh和PHP檔案
##而除此以外的所有人不能
解決中文亂碼問題
雖然一般來說中文設定都是網站開發人員在做開發時定義好的,但是Nginx依舊提供了這個功能.
與其說是解決中文亂碼問題不如說是更換nginx字符集的方法.
# vim /usr/local/nginx/conf/nginx.conf
charset utf-8
Nginx重定向
通過進行訪問重定向, 可以防止域名惡意決議到服務器IP
server {
listen 80;
server_name www.linux.org;
return 500;
}
##也可以這樣寫
server {
listen 80;
server_name www.linux.org;
rewrite ^(.*) http://www.linux.com permanent;
}
- 前者將訪問
www.linux.org的請求全部回傳了500 - 后者則將訪問請求跳轉到了
www.linux.com,避免對原本訪問地址的壓力
同理,我們可以用它來實作一些業務上的需求
##80重定向443,實作自動訪問加密
server {
listen 80;
server_name www.linux.org;
rewrite ^/(.*)$ https://www.linux.org/$1 permanent;
}
##業務域名跳轉
##www.linux.org/bbs 重定向 bbs.linux.org
server {
listen 80;
server_name www.linux.org;
rewrite ^/bbs$ http://bbs.linux.org permanent;
rewrite ^/bbs/(.*)$ http://bbs.linux.org/$1 permanent;
location / {
root /web1;
index index.html;
}
}
server {
listen 80;
server_name bbs.linux.org;
location / {
root /bbs;
index index.html;
}
}
##bbs.linux.org 重定向 www.linux.org/bbs
server {
listen 80;
server_name www.linux.org bbs.linux.org;
if ($host = "bbs.linux.org"){
rewrite ^/(.*)$ http://www.linux.org/bbs/$1 permanent;
}
location / {
root /web1;
index index.html;
}
}
防盜鏈
##第一種方式
server {
listen 80;
server_name www.linux.org;
location ~ \.(jpg|png)$ {
valid_referers none blocked www.linux.org;
if ($invalid_referer) {
return 403;
}
}
}
##第二種方式
server {
listen 80;
server_name www.linux.org;
location ~ \.(jpg|png)$ {
valid_referers none blocked www.linux.org;
if ($invalid_referer) {
rewrite ^/ http://172.25.5.3/daolian.jpg;
}
}
}
valid_referers 指令
語法: valid_referers none|blocked|server_names string ...;
默認值: no
使用欄位: server, location
功能: 此指令在 referer頭的基礎上為 $invalid_referer 變數賦值, 可以實作簡單的防盜鏈功能
如果 valid_referers串列中沒有匹配Referer請求頭, $invalid_referer將被設定為1, 否則為0(或空值)
引數:
none
請求頭中不存在 Referer欄位('空值', 比如直接在瀏覽器打開一個圖片URI)
blocked
請求頭中存在 Referer欄位, 但值不是以"http(s)://"開頭的字串(被防火墻或代理服務器修改洗掉)
server_names
Referer欄位包含服務器名稱
arbitrary string
定義服務器名稱和可選 URI前綴, 服務器名稱的開頭或結尾可以有一個"*"
regular expression
使用正則匹配, 第一個符號為"~"
Goaccess 日志可視化
軟體安裝
wget https://tar.goaccess.io/goaccess-1.4.tar.gz
tar -xzvf goaccess-1.4.tar.gz
cd goaccess-1.4/
./configure --enable-utf8 --enable-geoip=legacy
make
make install
簡單使用
goaccess access.log -o /usr/local/nginx/html/report.html --log-format=COMBINED --real-time-html

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/283178.html
標籤:其他
上一篇:ARP地址決議詳細流程(一)
