目录
二、Nginx配置文件nginx.conf详解
上回说到,在Linux系统下安装部署Nginx,接下来就是最重要的,nginx应该如何配置。
首先先介绍一下nginx.conf的结构,如图:
配置文件原文如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
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 on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
include back_server.conf;
include web_server.conf;
# 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;
# }
#}
}
1、main模块
- user nobody: 是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认为nobody账号。
- worker_processes 1:是个主模块指令,指定了Nginx要开启的worker进程数。建议指定和CPU的数量一致即可,通常等于CPU数量或者2倍于CPU。
- error_log:是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
- pid:是个主模块指令,用来指定进程pid的存储文件位置。
2、events模块
- use epoll:是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。
- worker_connections 1024:也是个事件模块指令,用于定义Nginx每个worker进程的最大连接数,默认是1024。最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections。
在作为反向代理时,max_clients变为:max_clients = worker_processes * worker_connections/4。
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
3、http模块
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 on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
include back_server.conf;
- include:引入外部配置文件,其中“include mime.types;”,该指令引入的是请求传输的内容类型。
- default_type:属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。
- log_format:日志格式设置。$remote_addr与$http_x_forwarded_for:用以记录客户端的ip地址;$remote_user:用来记录客户端用户名称;$time_local: 用来记录访问时间与时区;$request: 用来记录请求的url与http协议;$status: 用来记录请求状态;成功是200,$body_bytes_sent :记录发送给客户端文件主体内容大小;$http_referer:用来记录从那个页面链接访问过来的;$http_user_agent:记录客户浏览器的相关信息;
- access_log:指定日志存放位置。
- sendfile:指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。
- tcp_nopush on:数据包累积到一定大小的时候开始发送,此选项仅在使用sendfile的时候使用。此选项允许或禁止使用socke的TCP_CORK的选项。
- keepalive_timeout 65:设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。
- gzip:将传输的文件进行压缩,提高响应速度,节约带宽。
gzip_min_length设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字节数,小于1K可能会越压越大;
gzip_buffers表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果;
gzip_http_version用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可;
gzip_comp_level用来指定GZIP压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源;
gzip_types用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的;
gzip_vary选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过Nginx压缩的数据。
4、upstream模块
upstream Y_server {
server 172.21.0.7:8080;
server 172.21.0.8:8080;
server 172.21.0.9:8080;
}
该模块配置了上游服务器,用于配置负载均衡。nginx默认的负载均衡策略为轮训策略。
- 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;默认weight=1
- 权重(Weight):指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下;
upstream Y_server {
server 172.21.0.7:8080 weitht=1;
server 172.21.0.8:8080 weitht=3;
server 172.21.0.9:8080 weitht=5;
}
- ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题;
- fair:比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块;
- url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
upstream Y_server {
ip_hash;
#fair;
#hash $request_uri;
server 172.21.0.7:8080 down;
server 172.21.0.8:8080;
server 172.21.0.9:8080;
}
-
可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
down:表示当前的server暂时不参与负载均衡;
backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻;
max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;
fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
5、server模块
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
- listen: 监听的端口号。
- server_name: 主机IP或者域名。
- location:URL匹配配置。
匹配的优先级顺序
(localtion =) > (localtion完整url) > (localtion ^~) > (localtion ~,~*) > (lcoaltion部分起始路径) > (/)
-
= 表示精确匹配
-
^~ 表示指定的路径开头
-
~ 表示区分大小写的正则匹配
-
~* 表示不区分大小写的正则匹配
-
/ 通用匹配,所有的URL都是以此为开头
匹配规则:
#空格 :默认匹配,普通匹配
location / {
root /home;
}
#= :精确匹配
location = /server/img/test.png {
root /home;
}
#~* :匹配正则表达式,不区分大小写
#符合图片的显示
location ~* \.(GIF|jpg|png|jpeg) {
root /home;
#缓存30秒有效
expires 30s;
}
#~ :匹配正则表达式,区分大小写
#GIF必须大写才能匹配到
location ~ \.(GIF|jpg|png|jpeg) {
root /home;
}
#^~ :以某个字符路径开头
location ^~ /server/img {
root /home;
}
- expires:设置浏览器缓存。
# expires 10s; 有效期10秒
# expires -1h; 过期时间为一个小时之前
# expires epoch; 不设置缓存
# expires off; 关闭缓存,默认
# expires max; 最大缓存时间
keepalive提高吞吐量:
upstream http_backend {
server 127.0.0.1:8080;
keepalive 16;
}
server {
...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}
说明:该指令出现在版本1.1.4中。该connections
参数设置每个工作进程的缓存中保留的与上游服务器的空闲保持连接的最大数量。超过此数量时,将关闭最近最少使用的连接。需要特别注意的是,该keepalive指令不限制Nginx工作进程可以打开的与上游服务器的连接总数。该connections参数应设置为足够小的数字,以使上游服务器也可以处理新的传入连接。 当使用默认轮循方法以外的负载平衡方法时,有必要在keepalive指令前将其激活。对于HTTP, 应该将proxy_http_version指令设置为“ 1.1
”,并清除“连接”标头字段。 ——截取自官网:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive