點關注,不迷路!如果本文對你有幫助的話不要忘記點贊支持哦!
1.nginx優勢說明
a. 占有記憶體少 (在3W并發連接中,開啟的10個nginx行程消耗記憶體大約150M)
b. 高并發能力強 (官方測驗能夠支撐5W并發連接,在實際生產環境中能到2-3W并發連接數)
c . 簡單 (組態檔通俗易懂)
d . 價格 (免費、開源)
e. 支持Rewriter重寫 (能夠根據域名、URL的不同,將HTTP請求分到不同的后端服務器群組)
f. 內置健康檢查 (如果nginx后端有幾個服務宕機了,不會影響前端訪問,能自動檢測服務狀態)
g. 節省帶寬 (支持GZIP壓縮,可以添加瀏覽器本地快取的Header頭)
h. 穩定性高,反向代理,很少宕機
i .中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等
2.場景說明
- 測驗資料:由于后端服務器采用集群部署,通過性能測驗工具jmeter分析出后端服務端處理用戶每秒請求數(QPS)的單并發峰值在8千左右,
- 問題分析途徑:nginx日志,
1、通過訪問日志,你可以得到用戶地域來源、跳轉來源、使用終端、某個URL訪問量等相關資訊,
2、通過錯誤日志,你可以得到系統某個服務或server的性能瓶頸等
- 調優程序:實作nginx限流、安全配置、優化行程數及并發連接數、nginx狀態監控等性能調優,
- 調優結果:當用戶請求數達到此峰值時實作限流,保證有效的請求通過nginx轉發給后端成功處理,ps:如果不做限流處理當請求數超過峰值時,有效的8千請求也會失效,造成服務器的宕機,
3. nginx日志切割實作
- nginx日志默認沒有分割,使用起來非常不方便
[root@bogon logs]# ll
總用量 24
-rw-r--r--. 1 root root 17403 2月 8 17:09 access.log
-rw-r--r--. 1 root root 186 2月 7 17:39 error.log
[root@bogon logs]# ll
總用量 24
-rw-r--r--. 1 root root 17628 2月 9 14:38 access.log
-rw-r--r--. 1 root root 186 2月 7 17:39 error.log
- shell腳本如下:
#!/bin/bash
#設定日志檔案存放目錄
LOG_HOME="/data/nginx/logs/"
#備分檔案名稱
LOG_PATH_BAK="$(date -d yesterday +%Y%m%d%H%M)".access.log
#重命名日志檔案
mv ${LOG_HOME}/access.log ${LOG_HOME}/${LOG_PATH_BAK}.log
#向nginx主行程發信號重新打開日志
kill -USR1 `cat /opt/nginx/logs/nginx.pid
- 創建crontab設定定時任務
*/1 * * * * sh /data/nginx/nginx_log.sh
[root@bogon logs]# ll
總用量 16
-rw-r--r--. 1 root root 1238 2月 9 17:44 202002081743.access.log
-rw-r--r--. 1 root root 2588 2月 9 17:45 202002081745.access.log
-rw-r--r--. 1 root root 0 2月 9 17:46 access.log
-rw-r--r--. 1 root root 0 2月 9 17:10 error.log
4.并發AB工具簡介
- 相對性能測驗工具jmeter而言,在Linux下ab工具更輕巧好用,BA命令簡介:
| key | 含義 |
|---|---|
| Document Path | 測驗的頁面 |
| Document Length | 頁面的大小 |
| Concurrency Level | 并發數量、并發用戶數 |
| Time taken for tests | 測驗耗費總時間 |
| Complete requests | 請求總量、并發連接數 |
| Failed requests | 請求失敗的數量 |
| Write errors | 錯誤數量 |
| Requests per second | 每秒鐘的請求量、吞吐率 |
| Time per request | 每次請求需要時間、回應時間 |
- Centos安裝命令:
yum install httpd-tools –y
- 測驗并發命令:
ab -c 1 -n 6 http://192.168.1.90:8070/index/index.html
192.168.1.91 - - [09/Feb/2020:11:55:23 +0000] "GET /index/index.html HTTP/1.0" 200 20 "-" "ApacheBench/2.3" "-"
192.168.1.91 - - [09/Feb/2020:11:55:23 +0000] "GET /index/index.html HTTP/1.0" 200 150 "-" "ApacheBench/2.3" "-"
192.168.1.91 - - [09/Feb/2020:11:55:23 +0000] "GET /index/index.html HTTP/1.0" 200 20 "-" "ApacheBench/2.3" "-"
192.168.1.91 - - [09/Feb/2020:11:55:23 +0000] "GET /index/index.html HTTP/1.0" 200 150 "-" "ApacheBench/2.3" "-"
5. nginx限流有三種方式實作
? limit_conn_zone
? limit_req_zone
? ngx_http_upstream_module
前兩種只能對客戶端(即單一ip限流)
- ngx_http_upstream_module限流示例(推薦)
? 該模塊是提供了我們需要的后端限流功能的
? 該模塊有一個引數:max_conns可以對服務端進行限流,版本要求:在nginx1.11.5版本以后,配置引數:
upstream localhost{
server 192.168.1.90:8071 max_conns=5;
server 192.168.1.90:8072 max_conns=5;
}
- 執行結果【可以看到結果有一個已經錯誤了,同理可以限制服務端訪問流量】:
[root@bogon ~]# ab -c 1 -n 6 http://192.168.1.90:8070/index/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.1.90 (be patient).....done
Server Software: nginx/1.17.8
Server Hostname: 192.168.1.90
Server Port: 8070
Document Path: /index/index.html
Document Length: 150 bytes
Concurrency Level: 1
Time taken for tests: 0.041 seconds
Complete requests: 6
Failed requests: 0
Write errors: 1
Total transferred: 2328 bytes
HTML transferred: 900 bytes
Requests per second: 146.03 [#/sec] (mean)
Time per request: 6.848 [ms] (mean)
Time per request: 6.848 [ms] (mean, across all concurrent requests)
Transfer rate: 55.33 [Kbytes/sec] received
6. 高并發下Nginx安全配置
- 版本安全
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 20
Content-Type: text/html
Date: Sun, 09 Feb 2020 11:42:08 GMT
ETag: W/"20-1581064798000"
Last-Modified: Fri, 07 Feb 2020 08:39:58 GMT
Server: nginx/1.17.8
- 回應頭資訊可以看到nginx的版本號,版本號暴露是不安全的,所以需要隱藏下nginx的版本號,配置server_tokens off;下面就看不到了,
http {
server_tokens off;
...
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 150
Content-Type: text/html
Date: Sun, 09 Feb 2020 11:45:09 GMT
ETag: W/"150-1581063242000"
Last-Modified: Fri, 07 Feb 2020 08:14:02 GMT
Server: nginx
- IP安全配置
白名單配置:
location / {
allow 192.168.136.1;
deny all;
}
黑名單設定:
location / {
deny 192.168.136.1;
allow all;
}
- 檔案安全配置
location /logs {
autoindex on;
root /opt/nginx/;
}
location ^/logs~*\.(log|txt)$ {
add_header Content-Type text/plain;
root /opt/nginx/;
}
7. Nginx配置行程數、并發數、系統優化
- 調整Nginx的主組態檔,增加并發量
worker_processes 2; #調整到與CPU數量一致
events {
worker_connection 65535; #每個worker最大并發連接數
}
- 調整內核引數
[root@proxy ~]# ulimit -a #查看所有的屬性值
[root@proxy ~]# ulimit -Hn 10000 #臨時設定硬限制
[root@proxy ~]# ulimit -Sn 10000 #設定軟限制
[root@proxy ~]# vim /etc/security/limits.conf
...
* soft nofile 100000
* hard nofile 100000
用戶/組 軟/硬限制 需要限制的專案 限制的值
- 驗證
ab -n 1 -c 20000 http://192.168.1.131/
8.高并發下Nginx狀態監控
- 配置Nginx的監控選項(組態檔路徑:nginx.conf)
添加如下代碼:
#設定Nginx狀態訪問地址
location /NginxStatus {
stub_status on;
access_log off;
}
- 插件安裝(在原始碼目錄下執行):
./configure --prefix=/opt/nginx/ --with-http_stub_status_module

- 引數說明:
活躍的連接數量
active connections
總共處理了n個連接 , 成功創建n次握手, 總共處理了n個請求
server accepts handled requests
每個連接有三種狀態waiting、reading、writing
reading —讀取客戶端的Header資訊數.這個操作只是讀取頭部資訊,讀取完后馬上進入writing狀態,因此時間很短
writing — 回應資料到客戶端的Header資訊數.這個操作不僅讀取頭部,還要等待服務回應,因此時間比較長,
waiting — 開啟keep-alive后等候下一次請求指令的駐留連接.
正常情況下waiting數量是比較多的,并不能說明性能差,反而如果reading+writing數量比較多說明服務并發有問題,
查看Nginx并發行程數:ps -ef|grep nginx | wc -l
查看Web服務器TCP連接狀態:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
- 決議:
CLOSED //無連接是活動的或正在進行
LISTEN //服務器在等待進入呼叫
SYN_RECV //一個連接請求已經到達,等待確認
SYN_SENT //應用已經開始,打開一個連接
ESTABLISHED //正常資料傳輸狀態/當前并發連接數
FIN_WAIT1 //應用說它已經完成
FIN_WAIT2 //另一邊已同意釋放
ITMED_WAIT //等待所有分組死掉
CLOSING //兩邊同時嘗試關閉
TIME_WAIT //另一邊已初始化一個釋放
LAST_ACK //等待所有分組死掉
查看Web服務器TCP連接狀態:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
-
最后并發超過峰值后的服務端jvm監控顯正常

到此這篇關于文章就結束了!
點關注,不迷路!如果本文對你有幫助的話不要忘記點贊支持哦!


上述面試題答案都整理成檔案筆記, 也還整理了一些面試資料&最新2020收集的一些大廠的面試真題(都整理成檔案,小部分截圖),有需要的可以 點擊進入暗號:csdn ,
希望對大家有所幫助,有用的話點贊給我支持!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/20336.html
標籤:其他
上一篇:免密方式遠程同步檔案時ERROR:password file must not be other-accessible
