Nginx介绍

优劣势

Nginx是一款高性能的HTTP和反向代理服务器(安装),有如下优势:

  • 高并发量:官方给出的数据,可以支持高达50000个并发连接数的响应。
  • 轻量级,内存消耗小:起Web服务处理静态资源,相比Tomcat占用更少的内存和资源。
  • 简单稳定:配置简单,基本在一个conf文件中配置,性能稳定,可7*24不间断运行。
  • 模块化程度高、低成本、跨系统。

相比而言,劣势如下:

  • 动态处理差:Nginx处理静态文件消耗内存小,但是处理动态页面较弱,一般使用Nginx作为反向代理抗压力,Tomcat作为后端处理动态请求。
  • rewrite弱:虽然可以根据域名等不同可以将Http请求分发到不同的后端服务器组,但是相比Tomcat, Nginx的rewrite功能较弱。

配置

配置整体结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 全局配置
main
# 工作模式配置
events {
}
# http协议信息配置
http {
....
# 服务器主机访问配置
server {
....
# 路由配置,url匹配
location {
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
# 负载均衡配置
upstream name {
....
}
}

全局配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 指定worker进程运行用户及用户组,默认为nobody账号运行
user nobody nobody
# 指定开启的子进程数量,运行过程根据每个进程消耗的实际内存(一般几M~几十M不等)进行调整,通常为CPU核数的整数倍
worker_processes 32
# 指定错误日志文件位置
error_log logs/error.log
# 指定日志输出级别
error_log logs/error.log info
# 指定进程id的存储文件位置
pid logs/nginx.pid
# 指定一个进程可以打开最多文件数量的限制描述
worker_rlimit_nofile 2048

event配置

1
2
3
4
5
6
7
8
9
10
11
event {
# 指定可以同时接收的最大连接数量,最大连接数和work processes共同决定
worker_connections 1024;
# 指定nginx在收到一个新的连接通知后尽可能多的接受更多连接,如果设为off,nginx一个工作线程只能同时接受一个新连接
multi_accept on;
# 配置指定线程轮询的方法,根据系统来指定,如linux2.6+使用epoll, BSD如mac使用Kqueue
use epoll;
}

http配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
http {
###### 基础配置 ######
# 将文件的回写过程交给数据缓冲区去完成,而不是应用中完成,用于提升性能
sendfile on;
# 设置在一个数据包中发送所有头文件,而不是一个一个发
tcp_nopush on;
# 不要缓存数据,一段一段发送,如果对数据传输实时性有要求则配置,发送完一段数据就立即得到返回值
tcp_nodelay on;
# 客户端分配连接后的超时时间,服务器在这个时间过后关闭连接,考虑性能时,一般设置时间较短
keepalive_timeout 30;
# 混淆数据,值越大消耗内存越多,散列key冲突率会降低,检索速度更快
types_hash_max_size 2048;
# 隐藏版本号,用于提升网站安全
server_tokens off;
# 服务器名字的hash表大小
server_names_hash_bucket_size 128;
# 指定在当前文件中包含另一个文件
include /etc/nginx/mime.types;
# 指定默认处理的文件类型可以是二进制
default_type application/octet-stream;
###### SSL证书配置 ######
# 用于启动特定的加密协议
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 设置协商加密算法时,优先使用服务端的加密套件,而不是客户端浏览器的加密套件
ssl_prefer_server_ciphers on;
###### 日志配置 ######
# 设置存储访问记录的日志
access_log /var/log/nginx/access.log;
# 设置存储记录错误发生的日志
error_log /var/log/nginx/error.log;
###### Gzip 压缩配置 ######
# 采用gzip压缩的形式发送数据,可减少发送的数据量
gzip on;
# 为指定的客户端禁用gzip功能
gzip_disable "msie6";
# 有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
gzip_vary on;
# 允许或者禁止压缩基于请求和响应流。设置为any,意味着将会压缩所有请求
gzip_proxied any;
# 设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大
gzip_comp_level 6;
# 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。例如 4 8k 代表按照原始数据大小以8k为单位的4倍申请内存。默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果
gzip_buffers 4 8k;
# 值为1.0和1.1,表示是否压缩http协议1.0,选择1.0则1.0和1.1都可以压缩
gzip_http_version 1.1;
# 设置需要压缩的数据格式
gzip_types text/plain application/x-javascript text/css application/xml;
###### 虚拟主机配置 ######
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

server配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 虚拟主机配置,一个http中可配置多个server
server {
# 监听端口号
listen 80;
# 指定ip地址或域名,多个配置之间用空格分隔
server_name localhost 192.168.1.100;
# web资源的根目录
root /nginx/www;
# 用户访问web网站的全局首页
index index.html;
# 设置根路径中配置的网页默认编码格式
charset utf-8;
# 指定访问日志的存放路径
access_log logs/access.log;
# 指定访问错误日志的存放路径
error_log logs/error.log;
......
}

location配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
location / {
# 反向代理的服务器地址
proxy_pass http://localhost:8888;
# 重新定义或添加发送到后端服务器的请求头
proxy_set_header HOST $host;
# 此配置为了正确识别协议是http还是https
proxy_set_header X-Forwarded-Proto $scheme;
# 请求头放入客户端的ip,即真实ip
proxy_set_header X-Real-IP $remote_addr;
# 变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr区分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location匹配命令

1
2
3
4
5
6
7
8
9
10
11
# 波浪线表示执行一个正则匹配,区分大小写
~
# 表示执行一个正则匹配,不区分大小写
~*
# 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
^~
# 进行普通字符精确匹配
=

匹配优先级

1
2
3
4
5
6
7
=精确匹配会第一个被处理,如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先匹配,即匹配该项前需去看有没有正则表达式匹配和更长的匹配。
^~然后匹配该规则,匹配后,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配带有~和~*的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

upstream配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream name {
# 指定请求调度算法, 默认为加权轮询
ip_hash;
# 服务器分发的列表配置
server 192.168.1.100:8000;
# down为该主机暂停服务;max_fails为设置失败最大次数,超过最大次数则暂停服务;fail_timeout表示请求受理失败时,暂停指定时间后,重新发起请求
server 192.168.1.100:8001 down;
server 192.168.1.100:8002 max_fails=3;
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}

常用命令

查看帮助信息

1
nginx -h

查看版本

1
nginx -v

查看版本及配置参数信息

1
nginx -V

启动

1
start nginx

指定配置文件启动

1
start nginx -c filename

重新加载配置文件(修改之前的进程按照之前的配置正常运行至结束,而新进程使用新的配置)

1
nginx -s reload

关闭(在关闭前完成已经接收的连接请求)

1
nginx -s quit

快速关闭(不管连接)

1
nginx -s stop

测试配置是否正确

1
nginx -t

测试配置是否正确,指定的配置文件

1
nginx -t -c filename

重新打开日志(如将access.log文件名修改为access.log.bak,nginx配置中访问日志名仍为access.log,nginx未停止运行的情况下,访问日志会继续往access.log.bak日志中写入,使用此命令后,访问日志才会往access.log文件中写入)

1
nginx -s reopen