|
Nginx 是一个很强大的高性能 Web 和反向代理服务,它具有很多非常优越的特性,在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中表现较好,因此国内知名大厂例如:淘宝,京东,百度,新浪,网易,腾讯等等都在使用 Nginx 网站。 在我们的日常工作学习中,我们会该如何去优化自己的 Nginx 服务器?遇到以下问题我们该如何处理呢? 一、自定义返回客户端的404错误页面1)优化前,客户端使用浏览器访问不存在的页面,会提示404文件未找到 - : n0 W) g3 y; |0 `
- # firefox http://192.168.4.5/xxxxx //访问一个不存在的页面
复制代码
, r" j$ e% u3 w& i) o2)修改 Nginx 配置文件,自定义报错页面
, g$ L$ i) t; u5 Q- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
7 J1 e! S5 Z3 ~* n - .. ..
6 ^" F! d3 k& T - charset utf-8; //仅在需要中文时修改该选项
3 c7 v Q+ C% l$ Q - error_page 404 /404.html; //自定义错误页面
4 @& e" H' ?9 I, \7 {$ M - .. ..
& T8 D4 Z; N; Z! h
4 I9 o$ J' \" { f, D. ?4 e- # vim /usr/local/nginx/html/404.html //生成错误页面
' \% v7 ?( n8 e9 ~) I - Oops,No NO no page …
! f( w$ D. l! H2 n$ @0 s2 F
" m0 ~9 X& a4 _# A1 r- @; S- # nginx -s reload, W) p$ D- O& s
- # 请先确保 nginx 是启动状态,否则运行该命令会报错,报错信息如下:
( k! y3 c' n& P7 g! x) [ - #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
复制代码 3)优化后,客户端使用浏览器访问不存在的页面,会提示自己定义的 40x.html 页面- . `7 I3 q4 ?3 P
- # firefox http://192.168.4.5/xxxxx //访问一个不存在的页面
复制代码 , l( d$ P% A* l) `
常见的 http 状态码可用参考表所示 二、查看服务器状态信息5 O3 _$ {& O, }& _3 ~; n
1)编译安装时使用--with-http_stub_status_module开启状态页面模块/ D, n7 o1 U9 ?% O& m) V
- - k' O- }9 g' C4 e
- # tar -zxvf nginx-1.12.2.tar.gz
9 q3 e$ E2 O: ?% ^5 `& Y - # cd nginx-1.12.2$ K( r9 M& o: X( W6 M. ?/ y0 h
- # ./configure \
! _( `. A# h$ I$ Z - > --with-http_ssl_module //开启SSL加密功能
' a4 H1 G. s+ u! A7 W3 I3 s- q - > --with-stream //开启TCP/UDP代理模块
+ W$ b7 g1 s( B) f7 t+ m - > --with-http_stub_status_module //开启status状态页面" ?( L2 u, c' I+ A; C: ]/ v& V
- # 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 命令,功能一样,选项一样。
! j7 h% n7 {- d, r6 z# A- # /usr/local/nginx/sbin/nginx
) x0 \1 x! @# P. E8 f5 w; w - # netstat -anptu | grep nginx' i$ t, A5 Y! [% ^
- tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10441/nginx
- v% L4 D) A9 A* j8 r& \5 o - # ss -anptu | grep nginx
复制代码
; i% V* d6 y& N5 Z3)修改 Nginx 配置文件,定义状态页面
0 c$ F) |% x V4 z- # cat /usr/local/nginx/conf/nginx.conf
/ m/ m3 E4 j; z0 s - … …
# W! M0 Q! i% o& F* r+ Z - location /status {
- \/ p+ y3 V( [4 Y - stub_status on;- j' |' w& s+ y c3 G
- #allow IP地址;) x( D L" F; `0 V
- #deny IP地址;: H! ~1 A( B* o" ~% a2 C1 f+ k+ h' ~" p
- }
8 e# p s3 y( e% M. a/ C8 d" T - … …
6 @: C! N; C0 y" }' {, T$ d - # /usr/local/nginx/sbin/nginx -s reload
复制代码 4)优化后,查看状态页面信息* `4 A$ F, N1 j/ C! t
) f# [2 S& k+ ~" ]) l8 ?: Q/ s2 u- # curl http://192.168.4.5/status1 Y! D7 \& W4 \9 `! K7 y! H$ E
- Active connections: 1 ( b8 ?, c/ Z p1 x$ ^ A y2 c
- server accepts handled requests
3 T# @) Z& ]0 ~( U7 n1 M - 10 10 3
( z# j. S- ?. j" n0 }2 r3 K - 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高并发测试
+ ~9 L) r9 J* K) t2 u5 S- # ab -n 2000 -c 2000 http://192.168.4.5/
c; h2 l8 t( o Y - Benchmarking 192.168.4.5 (be patient)
1 i; ]2 d0 O* R: _- s# t; z6 m - socket: Too many open files (24) //提示打开文件数量过多
复制代码 ' i$ |7 u0 T. R I% l
2)修改 Nginx 配置文件,增加并发量 - % }; a4 Q7 {% ]2 k8 W- L
- # vim /usr/local/nginx/conf/nginx.conf7 l" P# V* ]) m* _
- .. ..
5 ^" M+ ]$ t8 p# q+ K7 h: j - worker_processes 2; //与CPU核心数量一致
$ ?& j& |: N( T - events {$ G6 W! ~& |2 I1 e. F) \+ o
- worker_connections 65535; //每个worker最大并发连接数
0 e6 z: N2 ^, O6 ?0 o/ J ? - }
2 j+ u$ {7 b9 I - .. ..5 G; j9 o$ C) d0 B
- # /usr/local/nginx/sbin/nginx -s reload
复制代码 - {4 K1 g1 b$ b: L# X
3)优化 Linux 内核参数(最大文件数量) - 3 f2 X# m3 W0 h8 \4 e$ u& \9 x
- # ulimit -a //查看所有属性值8 H# \, y4 q- d7 E% N2 y
- # ulimit -Hn 100000 //设置硬限制(临时规则)
% P, w; p4 y' [) k - # ulimit -Sn 100000 //设置软限制(临时规则)
2 j# b2 g3 w2 |9 J# Y! s - # vim /etc/security/limits.conf" K" ] ]7 T# r1 J. l
- .. ..) w7 N) E1 W! {1 [$ @6 i/ C0 X
- * soft nofile 1000004 X6 h; v6 L& i
- * hard nofile 100000
l& c* g- E2 g8 b r
! t) _( D c+ T# E! O8 v- #该配置文件分4列,分别如下:10.#用户或组 硬限制或软限制 需要限制的项目 限制的值
复制代码 8 g. P" {8 m7 Z( D
4)优化后测试服务器并发量(因为客户端没调内核参数,所以在proxy测试) - 0 d7 D3 d* f' a+ |! ~
- # 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)优化前,使用脚本测试长头部请求是否能获得响应
& P. P ?5 h- d- [root@proxy ~]# cat lnmp_soft/buffer.sh
2 `% A5 g+ \& { - #!/bin/bash
" B& K& Z' s f+ K) f& c. Z - URL=http://192.168.4.5/index.html?
7 _. ]1 y' }( E - for i in {1..5000}$ G( h9 q. C# [5 v4 f
- do
+ N( t' B$ |) w' Z9 D% ?4 m/ A - URL=${URL}v$i=$i
: ?9 U" p: m+ M7 n - done0 O( z& G9 b0 ?, }
- curl $URL //经过5000次循环后,生成一个长的URL地址栏7 j, s M# s- C# v
- [root@proxy ~]# ./buffer.sh
1 x% o- U- A9 [. W# p - .. ..
$ r9 B8 J( ? E. e# j( W1 x- B - <center><h1>414 Request-URI Too Large</h1></center> //提示头部信息过大
复制代码 2)修改 Nginx 配置文件,增加数据包头部缓存大小
9 f7 I" N0 `- r, s; b. I& F
; R6 M3 p, y5 G9 V% K- # vim /usr/local/nginx/conf/nginx.conf5 |, Q6 G% F# u [3 L: {
- ... ..
( y7 n+ _* E$ k - http {! b$ R5 d7 e. ?: Q* Q# e
- client_header_buffer_size 1k; //默认请求包头信息的缓存
' ]7 I0 D5 T: w - large_client_header_buffers 4 4k; //大请求包头部信息的缓存个数与容量
9 t9 u; M& R1 p9 y" g - .. ..
' ~* J' I/ B7 A6 ? - }1 X! h% Q2 n: J1 p0 Q8 u: h
- # /usr/local/nginx/sbin/nginx -s reload
复制代码 8 ]3 S. f1 b( ?2 ]$ [3 {. E
3)优化后,使用脚本测试长头部请求是否能获得响应 - 9 \# B7 F7 s+ p5 L
- 1.[root@proxy ~]# cat buffer.sh
5 h/ l/ m! V4 l1 B# ~7 y4 n3 W: h - 2.#!/bin/bash
5 I1 C8 O7 {& K: C; L4 o - 3.URL=http://192.168.4.5/index.html?
' Q' F F3 u- a. d) [ - 4.for i in {1..5000}
: W% ~3 E; |. A- F/ \% a - 5.do
. Z1 n% z+ Q) S& o q; c( Z - 6. URL=${URL}v$i=$i
2 P" f& l/ u* ~ v - 7.done
! C: T+ s4 {" U - 8.curl $URL0 ^5 j/ ^$ q+ h, \# J
- 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可以查看详细信息。 2)清空firefox本地缓存数据,如图所示。 3)改Nginx配置文件,定义对静态页面的缓存时间 - 6 i! r7 \6 Q6 l/ x
- # vim /usr/local/nginx/conf/nginx.conf4 I- m$ u" d$ i- I; V" ?
- server {6 X& c" ^8 l" h' Q/ H6 [0 h
- listen 80;
7 Z2 L1 K$ Z; E2 d - server_name localhost;+ ^$ o! C' P2 C$ T4 c1 Z
- location / {% _7 [$ @! W& y' D
- root html;) u5 T: k8 s; _9 p& D3 @
- index index.html index.htm;. m! k% B {. |
- }& }3 ^' ?' _, Z- \* ]
- location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
- U" `: z0 _" S% |5 K - expires 30d; //定义客户端缓存时间为30天; x7 U9 ]% P# y9 Y2 j
- }
2 Z. j4 u) f& h8 [+ u - }: y8 w+ W, N" I1 Z# q7 Z) W
- # cp /usr/share/backgrounds/day.jpg /usr/local/nginx/html. \3 H) X. ~- Z: ^- c
- # /usr/local/nginx/sbin/nginx -s reload. |6 g( y' @. S
- #请先确保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! B4)优化后,使用Firefox浏览器访问图片,再次查看缓存信息
4 b& z% T+ c8 b$ Z$ k b- # 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 |