Nginx准备
背景介绍
Nginx(“engine x”)一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个【POP3/SMTP/IMAP代理服务器】,是由伊戈尔·赛索耶夫(俄罗斯人)使用C语言编写的,Nginx的第一个版本是2004年10月4号发布的0.1.0版本。另外值得一提的是伊戈尔·赛索耶夫将Nginx的源码进行了开源,这也为Nginx的发展提供了良好的保障。
Nginx的功能特性及常用功能
Nginx提供的基本功能服务从大体上归纳为"基本HTTP服务"、“高级HTTP服务”和"邮件服务"等三大类。
优点
- 速度更快、并发更高
- 配置简单,扩展性强
- 高可靠性
- 热部署
- 成本低、BSD许可证
master和work线程
Nginx后台进程中包含一个master进程和多个worker进程,master进程主要用来管理worker进程,包含接收外界的信息,并将接收到的信号发送给各个worker进程,监控worker进程的状态,当worker进程出现异常退出后,会自动重新启动新的worker进程。而worker进程则是专门用来处理用户请求的,各个worker进程之间是平等的并且相互独立,处理请求的机会也是一样的。
信号
信号 | 作用 |
---|---|
TERM/INT | 立即关闭整个服务 |
QUIT | "优雅"地关闭整个服务 |
HUP | 重读配置文件并使用服务对新配置项生效 |
USR1 | 重新打开日志文件,可以用来进行日志切割 |
USR2 | 平滑升级到最新版的nginx |
WINCH | 所有子进程不在接收处理新连接,相当于给work进程发送QUIT指令 |
- 发送TERM/INT信号给master进程,会将Nginx服务立即关闭。
kill -TERM PID
kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
kill -INT PID / kill -INT `cat /usr/local/nginx/logs/nginx.pid`
- 发送QUIT信号给master进程,master进程会控制所有的work进程不再接收新的请求,等所有请求处理完后,在把进程都关闭掉。
kill -QUIT PID
kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
- 发送HUP信号给master进程,master进程会把控制旧的work进程不再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根据nginx的配置文件重新启动新的work进程
kill -HUP PID
kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
- 发送USR1信号给master进程,告诉Nginx重新开启日志文件
kill -USR1 PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
-
平滑升级 地址
-
发送WINCH信号给master进程,让master进程控制不让所有的work进程在接收新的请求了,请求处理完后关闭work进程。注意master进程不会被关闭掉
kill -WINCH PID
kill -WINCH`cat /usr/local/nginx/logs/nginx.pid`
命令行控制
参数 | 描述 |
---|---|
-?,-h | 帮助信息 |
-v | 打印版本号信息 |
-V | 打印版本号信息和配置信息并 |
-t | 测试nginx的配置文件语法是否正确 |
-T | 测试nginx的配置文件语法是否正确并列出用到的配置文件信息 |
-q | 在配置测试期间禁止显示非错误消息 |
-s signal | stop[快速关闭,类似于TERM/INT信号的作用],quit[优雅的关闭,类似于QUIT信号的作用],reopen[重新打开日志文件类似于USR1信号的作用],reload[类似于HUP信号的作用] |
-p prefix | 指定Nginx的prefix路径,(默认为: /usr/local/nginx/) |
-e filename | 设置errorr日志 (默认为:/usr/local/nginx/logs/error.log) |
-c filename | 指定Nginx的配置文件路径,(默认为: conf/nginx.conf) |
-g directives | 用来补充Nginx配置文件,向Nginx服务指定启动时应用全局的配置 |
Nginx核心配置文件
# worker进程的用户和用户组 默认值 nobody
user root;
# master_process 默认值为on
# master_process on;
# 开启工作进程 设置为cpu的核心数 默认值1
worker_processes auto;
# 是否以守护进程的方式启动
daemon on;
# 配置Nginx的错误日志存放路径
error_log /usr/local/nginx/logs/error.log crit;
# 配置Nginx当前master进程的进程号ID存储的文件路径
pid /usr/local/nginx/logs/nginx.pid;
events {
# 用来设置Nginx网络连接序列化
accept_mutex on;
#是否允许同时接收多个网络连接
multi_accept on;
# 配置单个worker进程最大的连接数
worker_connections 65535;
use epoll;
}
http {
# 配置Nginx响应前端请求默认的MIME类型
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
# 使用sendfile()传输文件,提高Nginx处理静态资源的性能
sendfile on;
tcp_nodelay on;
tcp_nopush on;
# 设置长连接的超时时间
keepalive_timeout 65;
# 设置一个keep-alive连接使用的次数
keepalive_requests;
#gzip on;
server {
# 配置监听端口
listen 80;
# 可以提供多个中间用空格分隔
server_name localhost;
location /text {
# 这里也可以设置成text/plain
default_type text/html;
return 200 "This is nginx's text";
}
location /json{
default_type application/json;
return 200 '{"name":"TOM","age":18}';
}
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
user指令
user
用于配置运行Nginx服务器的worker进程的用户和用户组。
语法 | user user [group] |
---|---|
默认值 | nobody |
位置 | 全局块 |
work process指令
1.master_process
用来指定是否开启工作进程。
语法 | master_process on off; |
---|---|
默认值 | master_process on; |
位置 | 全局块 |
2.worker_processes
用于配置Nginx生成工作进程的数量,建议将该值和服务器CPU的内核数保存一致。
语法 | worker_processes num/auto; |
---|---|
默认值 | 1 |
位置 | 全局块 |
daemon 指令
1.daemon
设定Nginx是否以守护进程的方式启动。
守护式进程是linux后台执行的一种服务进程,特点是独立于控制终端,不会随着终端关闭而停止。
语法 | daemon on off; |
---|---|
默认值 | daemon on; |
位置 | 全局块 |
2.pid
用来配置Nginx当前master进程的进程号ID存储的文件路径。
语法 | pid file; |
---|---|
默认值 | 默认为:/usr/local/nginx/logs/nginx.pid |
位置 | 全局块 |
3.error_log
用来配置Nginx的错误日志存放路径
语法 | error_log file [日志级别]; |
---|---|
默认值 | error_log logs/error.log error; |
位置 | 全局块、http、server、location |
4.include
用来引入其他配置文件,使Nginx的配置更加灵活
语法 | include file; |
---|---|
默认值 | 无 |
位置 | any |
events块
1.accept_mutex
用来设置Nginx网络连接序列化。
这个配置主要可以用来解决常说的"惊群"问题。大致意思是在某一个时刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。
语法 | accept_mutex on off; |
---|---|
默认值 | accept_mutex on; |
位置 | events |
2.multi_accept
用来设置是否允许同时接收多个网络连接
如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接
语法 | multi_accept on off; |
---|---|
默认值 | multi_accept off; |
位置 | events |
3.worker_connections
用来配置单个worker进程最大的连接数
这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。另外,number值不能大于操作系统支持打开的最大文件句柄数量。
语法 | worker_connections number; |
---|---|
默认值 | worker_commections 512; |
位置 | events |
4.use
用来设置Nginx服务器选择哪种事件驱动来处理网络消息。
注意:
此处所选择事件处理模型是Nginx优化部分的一个重要内容,method的可选值有select/poll/epoll/kqueue等,之前在准备centos环境的时候,我们强调过要使用linux内核在2.6以上,就是为了能使用epoll函数来优化Nginx。
另外这些值的选择,我们也可以在编译的时候使用
--with-select_module
、--without-select_module
、
--with-poll_module
、 --without-poll_module
来设置是否需要将对应的事件驱动模块编译到Nginx的内核。
语法 | use method; |
---|---|
默认值 | 根据操作系统定 |
位置 | events |
http块
-
定义MIME-Type
我们都知道浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIME Type。所以说MIME Type是网络资源的媒体类型。Nginx作为web服务器,也需要能够识别前端请求的资源类型。 -
default_type
用来配置Nginx响应前端请求默认的MIME类型。
自定义服务日志
1.access_log
用来设置用户访问日志的相关属性。
语法 | access_log path[format[buffer=size]] |
---|---|
默认值 | access_log logs/access.log combined; |
位置 | http , server , location |
2.log_format
用来指定日志的输出格式
语法 | log_format name [escape=default json none] string…; |
---|---|
默认值 | log_format combined “…”; |
位置 | http |
其他配置指令
1.sendfile
用来设置Nginx服务器是否使用sendfile()传输文件,该属性可以大大提高Nginx处理静态资源的性能
语法 | sendfile on off; |
---|---|
默认值 | sendfile off; |
位置 | http、server、location |
2.keepalive_timeout
用来设置长连接的超时时间。
我们都知道HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,服务端响应完毕后断开连接。
如何客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,效率相对来说比较多,使用keepalive模式,可以告诉服务器端在处理完一个请求后保持这个TCP连接的打开状态,若接收到来自这个客户端的其他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新连接,提升效率,但是这个连接也不能一直保持,这样的话,连接如果过多,也会是服务端的性能下降,这个时候就需要我们进行设置其的超时时间。
语法 | keepalive_timeout time; |
---|---|
默认值 | keepalive_timeout 65s; |
位置 | http、server、location |
3.keepalive_requests
用来设置一个keep-alive连接使用的次数。
语法 | keepalive_requests number; |
---|---|
默认值 | keepalive_requests 100; |
位置 | http、server、location |
Nginx静态资源的配置指令
listen指令
1.listen
用来配置监听端口。
语法 | listen address[:port] [default_server]…; listen port [default_server]…; |
---|---|
默认值 | listen *:80 | *:8000 |
位置 | server |
server_name指令
server_name
用来设置虚拟主机服务名称。127.0.0.1 、 localhost 、域名[www.baidu.com ]
1.精确匹配
server {
listen 80;
server_name www.baidu.com daidu.cn;
…
}
2.使用通配符配置
server_name中支持通配符"*",但需要注意的是通配符不能出现在域名的中间,只能出现在首段或尾段
server {
listen 80;
server_name .baidu.cn www.baidu.;
# www.baidu.cn abc.itcast.cn www.baidu.cn www.baidu.com
…
}
3.使用正则表达式配置
server_name中可以使用正则表达式,并且使用~
作为正则表达式字符串的开始标记。
代码 | 说明 |
---|---|
^ | 匹配搜索字符串开始位置 |
$ | 匹配搜索字符串结束位置 |
. | 匹配除换行符\n之外的任何单个字符 |
\ | 转义字符,将下一个字符标记为特殊字符 |
[xyz] | 字符集,与任意一个指定字符匹配 |
[a-z] | 字符范围,匹配指定范围内的任何字符 |
\w | 与以下任意字符匹配 A-Z a-z 0-9 和下划线,等效于[A-Za-z0-9_] |
\d | 数字字符匹配,等效于[0-9] |
{n} | 正好匹配n次 |
{n,} | 至少匹配n次 |
{n,m} | 匹配至少n次至多m次 |
* | 零次或多次,等效于{0,} |
+ | 一次或多次,等效于{1,} |
? | 零次或一次,等效于{0,1} |
server{
listen 80;
server_name ~^www.(\w+).com$;
default_type text/plain;
return 200 $1 $2 …;
}
注意 ~后面不能加空格,括号可以取值
location指令
location
用来设置请求的URI
uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。
语法 | location [ = ~ ~* ^~ @ ] uri{…} |
---|---|
默认值 | — |
位置 | server,location |
server {
listen 80;
server_name 127.0.0.1;
location /abc{
default_type text/plain;
return 200 “access success”;
}
}
= : 用于不包含正则表达式的uri前,必须与指定的模式精确匹配
server {
listen 80;
server_name 127.0.0.1;
location =/abc{
default_type text/plain;
return 200 “access success”;
}
}
可以匹配到
http://127.0.0.1/abc
http://127.0.0.1/abc?p1=TOM
匹配不到
http://127.0.0.1/abc/
http://127.0.0.1/abcdef
~ : 用于表示当前uri中包含了正则表达式,并且区分大小写
~*: 用于表示当前uri中包含了正则表达式,并且不区分大小写
换句话说,如果uri包含了正则表达式,需要用上述两个符合来标识
server {
listen 80;
server_name 127.0.0.1;
location ~^/abc\wKaTeX parse error: Expected 'EOF', got '}' at position 64: …s success"; } }̲ server { list…{
default_type text/plain;
return 200 “access success”;
}
}
^~: 用于不包含正则表达式的uri前,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了。
server {
listen 80;
server_name 127.0.0.1;
location ^~/abc{
default_type text/plain;
return 200 “access success”;
}
}
设置请求资源的目录root / alias
root
设置请求的根目录
语法 | root path; |
---|---|
默认值 | root html; |
位置 | http、server、location |
path为Nginx服务器接收到请求以后查找资源的根目录路径。
alias
用来更改location的URI
语法 | alias path; |
---|---|
默认值 | — |
位置 | location |
在/usr/local/nginx/html
目录下创建一个 images目录,并在目录下放入一张图片mv.png
图片
location /images {
root /usr/local/nginx/html;
}
访问图片的路径为:
http://127.0.0.1/images/mv.png
如果把root改为alias
location /images {
alias /usr/local/nginx/html;
}
再次访问上述地址,页面会出现404的错误,查看错误日志会发现是因为地址不对,所以验证了:
root的处理结果是: root路径+location路径
/usr/local/nginx/html/images/mv.png
alias的处理结果是:使用alias路径替换location路径
/usr/local/nginx/html/images
需要在alias后面路径改为
location /images {
alias /usr/local/nginx/html/images;
}
如果location路径是以/结尾,则alias也必须是以/结尾,root没有要求 将上述配置修改为
location /images/ {
alias /usr/local/nginx/html/images;
}
访问就会出问题,查看错误日志还是路径不对,所以需要把alias后面加上 /
小结:
root的处理结果是: root路径+location路径
alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的含义。
如果location路径是以/结尾,则alias也必须是以/结尾,root没有要求
index指令
index:设置网站的默认首页 index后面可以跟多个设置,如果访问的时候没有指定具体访问的资源,则会依次进行查找,找到第一个为止。
语法 | index file …; |
---|---|
默认值 | index index.html; |
位置 | http、server、location |
location / {
root /usr/local/nginx/html;
index index.html index.htm;
}
访问该location的时候,可以通过 http://ip:port/,地址后面如果不添加任何内容,则默认依次访问index.html和index.htm,找到第一个来进行返回
error_page指令
error_page:设置网站的错误页面
语法 | error_page code … [=[response]] uri; |
---|---|
默认值 | — |
位置 | http、server、location… |
1.可以指定具体跳转的地址
server {
error_page 404 http://www.baidu.cn;
}
2.可以指定重定向地址
server{
error_page 404 /50x.html;
error_page 500 502 503 504 /50x.html;
location =/50x.html{
root html;
}
}
3.使用location的@符合完成错误信息展示
server{
error_page 404 @jump_to_error;
location @jump_to_error {
default_type text/plain;
return 404 ‘Not Found Page…’;
}
}
可选项=[response]
的作用是用来将相应代码更改为另外一个
server{
error_page 404 =200 /50x.html;
location =/50x.html{
root html;
}
}
这样的话,当返回404找不到对应的资源的时候,在浏览器上可以看到,最终返回的状态码是200,这块需要注意下,编写error_page后面的内容,404后面需要加空格,200前面不能加空格