你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何去优化自己的 Nginx 服务器?

[复制链接]
gaosmile 发布时间:2021-1-5 12:14
Nginx 是一个很强大的高性能 Web 和反向代理服务,它具有很多非常优越的特性,在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中表现较好,因此国内知名大厂例如:淘宝,京东,百度,新浪,网易,腾讯等等都在使用 Nginx 网站。
在我们的日常工作学习中,我们会该如何去优化自己的 Nginx 服务器?遇到以下问题我们该如何处理呢?
一、自定义返回客户端的404错误页面
1)优化前,客户端使用浏览器访问不存在的页面,会提示404文件未找到
  1. : n0 W) g3 y; |0 `
  2. # firefox http://192.168.4.5/xxxxx //访问一个不存在的页面
复制代码

, r" j$ e% u3 w& i) o
2)修改 Nginx 配置文件,自定义报错页面

  1. , g$ L$ i) t; u5 Q
  2. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    7 J1 e! S5 Z3 ~* n
  3. .. ..
    6 ^" F! d3 k& T
  4.         charset utf-8;                    //仅在需要中文时修改该选项
    3 c7 v  Q+ C% l$ Q
  5. error_page   404  /404.html;    //自定义错误页面
    4 @& e" H' ?9 I, \7 {$ M
  6. .. ..
    & T8 D4 Z; N; Z! h

  7. 4 I9 o$ J' \" {  f, D. ?4 e
  8. # vim /usr/local/nginx/html/404.html  //生成错误页面
    ' \% v7 ?( n8 e9 ~) I
  9. Oops,No NO no page …
    ! f( w$ D. l! H2 n$ @0 s2 F

  10. " m0 ~9 X& a4 _# A1 r- @; S
  11. # nginx -s reload, W) p$ D- O& s
  12. # 请先确保 nginx 是启动状态,否则运行该命令会报错,报错信息如下:
    ( k! y3 c' n& P7 g! x) [
  13. #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
复制代码
3)优化后,客户端使用浏览器访问不存在的页面,会提示自己定义的 40x.html 页面
  1. . `7 I3 q4 ?3 P
  2. # firefox http://192.168.4.5/xxxxx //访问一个不存在的页面
复制代码
, l( d$ P% A* l) `
常见的 http 状态码可用参考表所示
微信图片_20210105121329.png
二、查看服务器状态信息5 O3 _$ {& O, }& _3 ~; n
1)编译安装时使用--with-http_stub_status_module开启状态页面模块/ D, n7 o1 U9 ?% O& m) V
  1. - k' O- }9 g' C4 e
  2. # tar -zxvf nginx-1.12.2.tar.gz
    9 q3 e$ E2 O: ?% ^5 `& Y
  3. # cd nginx-1.12.2$ K( r9 M& o: X( W6 M. ?/ y0 h
  4. # ./configure   \
    ! _( `. A# h$ I$ Z
  5. > --with-http_ssl_module           //开启SSL加密功能
    ' a4 H1 G. s+ u! A7 W3 I3 s- q
  6. > --with-stream                    //开启TCP/UDP代理模块
    + W$ b7 g1 s( B) f7 t+ m
  7. > --with-http_stub_status_module   //开启status状态页面" ?( L2 u, c' I+ A; C: ]/ v& V
  8. # make && make install             //编译并安装
复制代码
0 `8 _3 l; v# o+ M( {* O) @3 |

4 r* D" [% @( ]2)启用 Nginx 服务并查看监听端口状态ss 命令可以查看系统中启动的端口信息,该命令常用选项如下:
  • -a 显示所有端口的信息
  • -n 以数字格式显示端口号
  • -t 显示TCP连接的端口
  • -u 显示UDP连接的端口
  • -l 显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
  • -p 显示监听端口的服务名称是什么(也就是程序名称)
    7 [* [8 h  E9 ]
注意:在 RHEL7 系统中可以使用ss命令替代 netstat 命令,功能一样,选项一样。

  1. ! j7 h% n7 {- d, r6 z# A
  2. # /usr/local/nginx/sbin/nginx
    ) x0 \1 x! @# P. E8 f5 w; w
  3. # netstat  -anptu  |  grep nginx' i$ t, A5 Y! [% ^
  4. tcp        0        0 0.0.0.0:80        0.0.0.0:*        LISTEN        10441/nginx
    - v% L4 D) A9 A* j8 r& \5 o
  5. # ss  -anptu  |  grep nginx
复制代码

; i% V* d6 y& N5 Z
3)修改 Nginx 配置文件,定义状态页面

  1. 0 c$ F) |% x  V4 z
  2. # cat /usr/local/nginx/conf/nginx.conf
    / m/ m3 E4 j; z0 s
  3. … …
    # W! M0 Q! i% o& F* r+ Z
  4. location /status {
    - \/ p+ y3 V( [4 Y
  5.                 stub_status on;- j' |' w& s+ y  c3 G
  6.                  #allow IP地址;) x( D  L" F; `0 V
  7.                  #deny IP地址;: H! ~1 A( B* o" ~% a2 C1 f+ k+ h' ~" p
  8.         }
    8 e# p  s3 y( e% M. a/ C8 d" T
  9. … …
    6 @: C! N; C0 y" }' {, T$ d
  10. # /usr/local/nginx/sbin/nginx -s reload
复制代码
4)优化后,查看状态页面信息* `4 A$ F, N1 j/ C! t

  1. ) f# [2 S& k+ ~" ]) l8 ?: Q/ s2 u
  2. # curl  http://192.168.4.5/status1 Y! D7 \& W4 \9 `! K7 y! H$ E
  3. Active connections: 1 ( b8 ?, c/ Z  p1 x$ ^  A  y2 c
  4. server accepts handled requests
    3 T# @) Z& ]0 ~( U7 n1 M
  5. 10 10 3
    ( z# j. S- ?. j" n0 }2 r3 K
  6. Reading: 0 Writing: 1 Waiting: 0
复制代码
Active connections:当前活动的连接数量。
. Q  |/ a0 k5 l; mAccepts:已经接受客户端的连接总数量。
5 `  G# d( l& T+ E0 WHandled:已经处理客户端的连接总数量。, C$ I/ x2 W" N! S5 p! {
(一般与accepts一致,除非服务器限制了连接数量)。
9 c9 `3 {. L: vRequests:客户端发送的请求数量。) Y+ X" x1 }, `; n; M4 x0 `
Reading:当前服务器正在读取客户端请求头的数量。# Q* i3 j+ Y; {, R
Writing:当前服务器正在写响应信息的数量。" }1 o8 y/ B% n- a/ B
Waiting:当前多少客户端在等待服务器的响应。
; X5 I+ \! ^' n9 C8 a2 |' X; L

- d  h# i8 l" Y2 F/ w$ k
# t; C( w' A4 `' {+ v
三、优化 Nginx 并发量
1)优化前使用ab高并发测试

  1. + ~9 L) r9 J* K) t2 u5 S
  2. # ab -n 2000 -c 2000 http://192.168.4.5/
      c; h2 l8 t( o  Y
  3. Benchmarking 192.168.4.5 (be patient)
    1 i; ]2 d0 O* R: _- s# t; z6 m
  4. socket: Too many open files (24)                //提示打开文件数量过多
复制代码
' i$ |7 u0 T. R  I% l
2)修改 Nginx 配置文件,增加并发量
  1. % }; a4 Q7 {% ]2 k8 W- L
  2. # vim /usr/local/nginx/conf/nginx.conf7 l" P# V* ]) m* _
  3. .. ..
    5 ^" M+ ]$ t8 p# q+ K7 h: j
  4. worker_processes  2;                    //与CPU核心数量一致
    $ ?& j& |: N( T
  5. events {$ G6 W! ~& |2 I1 e. F) \+ o
  6. worker_connections 65535;        //每个worker最大并发连接数
    0 e6 z: N2 ^, O6 ?0 o/ J  ?
  7. }
    2 j+ u$ {7 b9 I
  8. .. ..5 G; j9 o$ C) d0 B
  9. # /usr/local/nginx/sbin/nginx -s reload
复制代码
- {4 K1 g1 b$ b: L# X
3)优化 Linux 内核参数(最大文件数量)
  1. 3 f2 X# m3 W0 h8 \4 e$ u& \9 x
  2. # ulimit -a                        //查看所有属性值8 H# \, y4 q- d7 E% N2 y
  3. # ulimit -Hn 100000                //设置硬限制(临时规则)
    % P, w; p4 y' [) k
  4. # ulimit -Sn 100000                //设置软限制(临时规则)
    2 j# b2 g3 w2 |9 J# Y! s
  5. # vim /etc/security/limits.conf" K" ]  ]7 T# r1 J. l
  6.     .. ..) w7 N) E1 W! {1 [$ @6 i/ C0 X
  7. *               soft    nofile            1000004 X6 h; v6 L& i
  8. *               hard    nofile            100000
      l& c* g- E2 g8 b  r

  9. ! t) _( D  c+ T# E! O8 v
  10. #该配置文件分4列,分别如下:10.#用户或组    硬限制或软限制    需要限制的项目   限制的值
复制代码
8 g. P" {8 m7 Z( D
4)优化后测试服务器并发量(因为客户端没调内核参数,所以在proxy测试)
  1. 0 d7 D3 d* f' a+ |! ~
  2. # ab -n 2000 -c 2000 http://192.168.4.5/
复制代码

  {  a/ Y. P, T* h9 h7 g& m, Q$ X% Q  w- W3 f! v! S
四、优化 Nginx 数据包头缓存
1)优化前,使用脚本测试长头部请求是否能获得响应

  1. & P. P  ?5 h- d
  2. [root@proxy ~]# cat lnmp_soft/buffer.sh
    2 `% A5 g+ \& {
  3. #!/bin/bash
    " B& K& Z' s  f+ K) f& c. Z
  4. URL=http://192.168.4.5/index.html?
    7 _. ]1 y' }( E
  5. for i in {1..5000}$ G( h9 q. C# [5 v4 f
  6. do
    + N( t' B$ |) w' Z9 D% ?4 m/ A
  7.     URL=${URL}v$i=$i
    : ?9 U" p: m+ M7 n
  8. done0 O( z& G9 b0 ?, }
  9. curl $URL                                //经过5000次循环后,生成一个长的URL地址栏7 j, s  M# s- C# v
  10. [root@proxy ~]# ./buffer.sh
    1 x% o- U- A9 [. W# p
  11. .. ..
    $ r9 B8 J( ?  E. e# j( W1 x- B
  12. <center><h1>414 Request-URI Too Large</h1></center>        //提示头部信息过大
复制代码
2)修改 Nginx 配置文件,增加数据包头部缓存大小
9 f7 I" N0 `- r, s; b. I& F

  1. ; R6 M3 p, y5 G9 V% K
  2. # vim /usr/local/nginx/conf/nginx.conf5 |, Q6 G% F# u  [3 L: {
  3. ... ..
    ( y7 n+ _* E$ k
  4. http {! b$ R5 d7 e. ?: Q* Q# e
  5. client_header_buffer_size    1k;        //默认请求包头信息的缓存   
    ' ]7 I0 D5 T: w
  6. large_client_header_buffers  4 4k;        //大请求包头部信息的缓存个数与容量
    9 t9 u; M& R1 p9 y" g
  7. .. ..
    ' ~* J' I/ B7 A6 ?
  8. }1 X! h% Q2 n: J1 p0 Q8 u: h
  9. # /usr/local/nginx/sbin/nginx -s reload
复制代码
8 ]3 S. f1 b( ?2 ]$ [3 {. E
3)优化后,使用脚本测试长头部请求是否能获得响应
  1. 9 \# B7 F7 s+ p5 L
  2. 1.[root@proxy ~]# cat buffer.sh
    5 h/ l/ m! V4 l1 B# ~7 y4 n3 W: h
  3. 2.#!/bin/bash
    5 I1 C8 O7 {& K: C; L4 o
  4. 3.URL=http://192.168.4.5/index.html?
    ' Q' F  F3 u- a. d) [
  5. 4.for i in {1..5000}
    : W% ~3 E; |. A- F/ \% a
  6. 5.do
    . Z1 n% z+ Q) S& o  q; c( Z
  7. 6.    URL=${URL}v$i=$i
    2 P" f& l/ u* ~  v
  8. 7.done
    ! C: T+ s4 {" U
  9. 8.curl $URL0 ^5 j/ ^$ q+ h, \# J
  10. 9.[root@proxy ~]# ./buffer.sh
复制代码

# @' ~; k: z# `, S+ a: y( k
% V3 T+ r6 w! T' M8 |. ^五、浏览器本地缓存静态数据
1)使用Firefox浏览器查看缓存
以Firefox浏览器为例,在Firefox地址栏内输入about:cache将显示Firefox浏览器的缓存信息,如图所示,点击List Cache Entries可以查看详细信息。
微信图片_20210105121332.png
2)清空firefox本地缓存数据,如图所示。
微信图片_20210105121335.png
3)改Nginx配置文件,定义对静态页面的缓存时间
  1. 6 i! r7 \6 Q6 l/ x
  2. # vim /usr/local/nginx/conf/nginx.conf4 I- m$ u" d$ i- I; V" ?
  3. server {6 X& c" ^8 l" h' Q/ H6 [0 h
  4.         listen       80;
    7 Z2 L1 K$ Z; E2 d
  5.         server_name  localhost;+ ^$ o! C' P2 C$ T4 c1 Z
  6.         location / {% _7 [$ @! W& y' D
  7.             root   html;) u5 T: k8 s; _9 p& D3 @
  8.             index  index.html index.htm;. m! k% B  {. |
  9.         }& }3 ^' ?' _, Z- \* ]
  10. location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
    - U" `: z0 _" S% |5 K
  11. expires        30d;            //定义客户端缓存时间为30天; x7 U9 ]% P# y9 Y2 j
  12. }
    2 Z. j4 u) f& h8 [+ u
  13. }: y8 w+ W, N" I1 Z# q7 Z) W
  14. # cp /usr/share/backgrounds/day.jpg /usr/local/nginx/html. \3 H) X. ~- Z: ^- c
  15. # /usr/local/nginx/sbin/nginx -s reload. |6 g( y' @. S
  16. #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:16.#[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
复制代码

4 m- l: r5 ^* W, |. b3 E7 m& x# j! B
4)优化后,使用Firefox浏览器访问图片,再次查看缓存信息

  1. 4 b& z% T+ c8 b$ Z$ k  b
  2. # firefox http://192.168.4.5/day.jpg
复制代码
在 firefox 地址栏内输入 about:cache,查看本地缓存数据,查看是否有图片以及过期时间是否正确。
+ r$ Q) s. K4 V& n
, b9 Z/ Y# x5 G. c! G0 i
赞 收藏 评论0 发布时间:2021-1-5 12:14

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版