Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/STMP服务器,此处只说HTTP和反向代理服务。由于nginx的高效和反向代理功能,已经超过一大半的网站都使用Nginx进行承载,身为一个IT从业人员,如果没听过,没问题nginx是在愧对自己。当然还有一款国人春哥的升级版OpenResty是将nginx和LuaJIT整合到一起,提供了更加可控的动态Web平台。

安装及模块

安装Nginx前需要安装一些编辑工具及库文件

// 编辑工具及库 
# yum -y install make zlib  zlib-devel gcc-c++ libtool openssl openss-devel

// 安装PCRE
# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
# tar zxvf pcre-8.35.tar.gz
# cd pcre-8.35
# ./configure
# make && make install
# pcre-config --version

下载Nginx并进行安装。

// 进入解压后的目录
#  ./configure \
	--prefix=/usr/local/nginx \
	--with-http_stub_status_module \
	--with-http_ssl_module \
	--with-pcre=/usr/local/src/pcre-8.35
	
# make
# make install
# /usr/local/nginx/sbin/nginx -v

如果一切OK,通过上述的命令就可以完成nginx的安装了。Nginx文件非常小,但是其性能非常卓越,其中一个原因是Nginx自带的功能相对较少,但是允许以模块的方式添加自定义功能,因此Nginx越发强大。Nginx模块 是 被编译进入Nginx,并不像Apache那样去编译一个so文件,在配置里面指定是否加载,解析的时候Nginx的哥哥模块都有机会去接收处理某个请求,但是URL请求的模块只能有一个。可以通过-V参数查看当前Nginx已经安装了那些模块。至于常用的模块可以查找模块可以通过如下俩个网站查找:

  • http://www.nginx.cn/doc/index.html
  • http://nginx.org/en/docs/ngx_core_module.html
  • http://openresty.org/cn/components.html
sbin/nginx -V
nginx version: openresty/1.11.2.5
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: 
--prefix=/usr/local/openresty/nginx 
--with-cc-opt=-O2 
--add-module=../ngx_devel_kit-0.3.0 
--add-module=../echo-nginx-module-0.61 
--add-module=../xss-nginx-module-0.05 
--add-module=../ngx_coolkit-0.2rc3
--with-http_v2_module 
--with-http_realip_module 
--with-http_sub_module
...

当需要安装第三方模块可以按照如下命令格式安装,主要不要make install而是直接把编辑出来的objs/nginx文件直接覆盖。

./configure --prefix=/安装目录 --add-module=/第三方模块目录
// 例如安装pagespeed模块
#  ./configure \
	--prefix=/usr/local/nginx \
	--with-http_stub_status_module \
	--with-http_ssl_module \
	--with-pcre=/usr/local/src/pcre-8.35
	--add-module=../ngx_pagespeed-master -add-module=/模块路径
	
# make
# /usr/local/nginx/sbin/nginx -V

# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak
# cp objs/nginx /usr/local/nginx/sbin/nginx
// test
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s realod

常用的一些模块

  • ngx_http_core_module 包括一些核心的 http 参数配置,对应 Nginx 的配置为 HTTP 区块部分
  • ngx_http_access_module访问控制模块,用来控制网站用户对 Nginx 的访问
  • ngx_http_gzip_module压缩模块,对 Nginx 返回的数据压缩,属于性能优化模块
  • ngx_http_fastcgi_moduleFastCGI 模块,和动态应用相关的模块,如 PHP
  • ngx_http_proxy_moduleproxy 代理模块
  • ngx_http_upstream_module负载均衡模块,可实现网站的负载均衡和节点的健康检查
  • ngx_http_rewrite_moduleURL 地址重写模块
  • ngx_http_limit_conn_module限制用户并发连接数以及请求数的模块
  • ngx_http_limit_req_module根据定义的 key 限制 Nginx 请求过程的速率
  • ngx_http_log_module访问日志模块,以指定的格式记录 Nginx 客户访问日志等信息
  • ngx_http_auth_basic_moduleWeb 认证模块,设置 Web 用户通过账号密码访问 Nginx
  • ngx_http_ssl_modulessl 模块,用于加密的 http 连接,如 https
  • ngx_http_stub_status_module记录 Nginx 基本访问状态信息等的模块

使用Nginx

安装后就可以使用nginx了,这里介绍使用Nginx常用几个命令

// 启动Nginx
# /usr/local/nginx/sbin/nginx
// 测试配置文件是否有错误
# /usr/local/nginx/sbin/nginx -t
// 查看nginx的版本
# /usr/local/nginx/sbin/nginx -v  
// 查看Nginx版本和编译安装时的编译参数
# /usr/local/nginx/sbin/nginx -V 
// 强制停止Nginx服务
# /usr/local/nginx/sbin/nginx -s stop 
// 优雅地停止Nginx服务(即处理完所有请求后再停止服务)
# /usr/local/nginx/sbin/nginx -s quit  
// 重新加载Nginx配置文件,然后以优雅的方式重启Nginx
# /usr/local/nginx/sbin/nginx -s reload    

添加模块

有些时间最初的安装总是不尽人意,比如我进场安装的是将忘记安装--with-http_stub_status_module模块。而网站又不能停,这是可以使用如下方式重新编译并安装。

# 重新configure 将自己需要的模块添加进去
./configure --prefix=/usr/local/openresty --with-luajit --with-http_v2_module --with-http_realip_module --with-http_sub_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-pcre --with-http_stub_status_module

# make或者gmake

# 备份原有的nginx
$ cp sbin/nginx sbin/nginx.old

# 将新编译的nginx复制过来nginx在objs下 openresty在build/nginx-1.11.2/objs/nginx下
$ cp -f  objs/nginx sbin/nginx

# 检测并平滑加载
$ sbin/nginx -V
$ sbin/nginx -t 
$ sbin/nginx -s reload

监控

兵未动粮草先行,在正式运行之前充分的掌握各种指标相当重要,在nginx中掌握基本的信息可以添加http_stub_status模块

# 安装该模块
$ .configure --with-http_stub_status_module

# 在conf中配置
location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1; //本机测试需添加此条记录
    deny 192.168.1.1;
    allow 192.168.1.0/24; //允许192.168.1.0/24访问,拒绝192.168.1.1访问
    allow 10.1.1.0/16;
    allow 2620:100:e000::8001; //此处是ipv6的地址
    deny all; //除了上述地址,拒绝所有连接。写allow,deny时,注意顺序
}

# 加载配置
/usr/local/nginx/sbin/nginx -t  //测试配置是否正确
/usr/local/nginx/sbin/nginx -s reload

然后访问xxx/nginx_status即可看到该如下信息

Active connections: 3 
server accepts handled requests
 10 10 6 
Reading: 0 Writing: 1 Waiting: 0 


可能由于nginx的版本不同其处理连接和请求的工作方式上稍微有些差异,具体的模式请查阅官方文档,但总的来说其离不开如下几个状态:

active connections — 对后端发起的活动连接数 server accepts handled requests — nginx 总共处理了 16630948 个连接, 成功创建 16630948 次握手 (证明中间没有失败的), 总共处理了 31070465 个请求 (平均每次握手处理了 1.8个数据请求) reading — nginx 读取到客户端的Header信息数 writing — nginx 返回给客户端的Header信息数 waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading + writing),意思就是Nginx说已经处理完正在等候下一次请求指令的驻留连接。

除了http_stub_status_module模块外,当然常见的Nagios、Zabbix等都是可以很好的监控Nginx服务,但是有时候全家桶用起来不是那边便捷,当然如果有现成的套件直接撸上去即可。另外还有一些爱好者开发的开源工具也是相当棒的。

ngxtop

ngxtop一个看上去就很眼熟的命令。ngxtop parses your nginx access log and outputs useful, top-like, metrics of your nginx server. So you can tell what is happening with your server in real-time.其地址为:

https://github.com/lebinh/ngxtop

pip install ngxtop

# 默认情况下会读取/etc/nginx/nginx.conf文件
$ ngxtop

# 具体的使用方法请看官方文档

# 一些常见的用户法

# 查看实时状态
$ ngxto -c /usr/local/openresty/nginx/conf/nginx.conf

# 访问前几的IP
$ ngxtop -c /opt/nginx/conf/nginx.conf top remote_addr

# 显示状态码为404的请求
$ ngxtop -i 'status == 404' print request status

# 显示前二十请求次数最高的请求
$ ngxtop -n 20

GoAccess

简单来说呢 GoAccessopen in new window 是一个专门用来分析日志的工具,既可以在终端中展示结果,也可以生成 HTML 报表在浏览器中查看。GoAccess 最吸引人的一点就是它生成的 HTML 足够炫酷。

# yum install goaccess
# apt-get install goaccess


$ git clone https://github.com/allinurl/goaccess.git
$ cd goaccess
$ autoreconf -fiv
$ ./configure --enable-utf8 --enable-geoip=legacy
$ make
# make install

$ goaccess -f access.log
// 选择Combined Log Format (XLF/ELF) 进入统计界面
// 该界面有用是如下快捷键
F1或h:帮助
F5 :刷新主界面
q:退出程序/当前窗口/折叠当前模块
o或Enter:展开选中的模块或窗口
0-9以及Shift + 0:将选中的模块或窗口激活
k和j:模块内部移动
c:修改配色
^f和^b:模块中上下滚屏
tab shift+tab:前后切换模块
s:模块内部排序选择
/:在所有模块中搜索(支持正则)
n:找到下个匹配
g和G:跳到第一项/最后一项


另外如果对Nginx的日志进行定制的化,在使用goaccess前需要配置日志文件的解析格式。GoAccess的日志规范可以可以查阅https://goaccess.io/man#custom-log。当然可以使用如下开源工具进行转换https://github.com/stockrt/nginx2goaccess