nginx
默认的配置文件是在安装目录下的 conf
目录下,后续对 nginx
的使用基本上都是对此配置文件进行相应的修改。
配置文件中用#
符号表示注释内容。
配置文件主要包括三部分,main
、events
和http
用于进行nginx
全局信息的配置。
定义 nginx
运行的用户和用户组,默认由 nobody
账号运行。
指定nginx
要开启的子进程数量,通常数量是CPU
内核数量的整数倍。该值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的影响。
如果是在本地运行nginx
可以通过任务管理器中的性能选项中查看电脑cpu
核数。
定义错误日志文件的位置及输出级别(debug
/ info
/ notice
/ warn
/ error
/ crit
)。
用来指定进程id
的存储文件的位置(windows下可以注释掉)。
用于指定一个进程可以打开最多文件数量的描述。理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx
分配请求并不均匀,所以建议与ulimit -n
的值保持一致。
针对nginx
服务器的工作模式的一些操作配置。
指定单个进程最大连接数(最大连接数=连接数*进程数)。该值受系统进程最大打开文件数限制,需要使用命令ulimit -n
查看当前设置。
配置指定nginx
在收到一个新连接通知后尽可能多的接受更多的连接
配置指定了线程轮询的方法,如果是linux2.6+
,使用epoll
,如果是BSD
如Mac
请使用Kqueue
作为web
服务器,http
模块是nginx
最核心的一个模块,配置项也是比较多的(比如代理,日志,缓存、第三方模块等等),项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置。不过常规情况下,使用默认配置即可!
http {
#文件扩展名与文件类型映射表
#include 是个主模块指令,可以将配置文件拆分并引用,可以减少主配置文件的复杂度
include mime.types;
#默认文件类型
default_type application/octet-stream;
#charset utf-8; #默认编码
#定义虚拟主机日志的格式
#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,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
sendfile on;
#autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
#防止网络阻塞
#tcp_nopush on;
#长连接超时时间,单位是秒,默认为0
keepalive_timeout 65;
# gzip压缩功能设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 6; #压缩等级
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on; //和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
# http_proxy服务全局设置
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 75;
proxy_send_timeout 75;
proxy_read_timeout 75;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
}
配置http
模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。这部分是 nginx
服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
一个http
块可以包含多个server
块。
核心配置如下:
listen
:监听端口server_name
:指定ip
地址或者域名(可以有多个),多个配置之间用空格分隔root
:表示整个server
虚拟主机内的根目录,所有当前主机中web
项目的根目录index
:用户访问web
网站时的全局首页charset
:用于设置www/
路径中配置的网页的默认编码格式access_log
:用于指定该虚拟主机服务器中的访问记录日志存放路径error_log
:用于指定该虚拟主机服务器中访问错误日志的存放路径error_page
:指定遇到错误状态码时应展示的页面location
:是nginx
配置中出现最多的一个配置,主要用于配置路由访问信息。在路由访问信息配置中关联到反向代理、负载均衡等等各项功能。语法:location [=|~|~*|^~] /uri/ { … }
=
: 开头表示精确匹配~
: 开头表示区分大小写的正则匹配~*
: 开头表示不区分大小写的正则匹配!~
和!~*
分别为区分大小写不匹配及不区分大小写不匹配的正则^~
开头表示uri
以某个常规字符串开头,理解为匹配 url
路径即可。nginx
不对url
进行编码,因此请求为/static/20%/aa
,可以被规则^~ /static/ /aa
匹配到(注意是空格)。/
: 通用匹配,可以匹配任何请求可以配置多个location
,不过请求的匹配也是有一定的顺序的:
=
^~
,/
通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
假设配置如下:
location = / {
#规则1
}
location = /api {
#规则2
}
location ^~ /static/ {
#规则3
}
location ~ \.(gif|jpg|png|js|css)$ {
#规则4
}
location ~* \.png$ {
#规则5
}
location !~ \.xhtml$ {
#规则6
}
location !~* \.xhtml$ {
#规则7
}
location / {
#规则8
}
http://localhost/
,匹配规则1http://localhost/api
,匹配规则2http://localhost/static/1.png
,^~
会优先匹配规则3http://localhost/1.png
,匹配规则4,规则5不生效http://localhost/1.PNG
,匹配规则5,不会匹配规则4,规则5不区分大小写http://localhost/a.xhtml
不会匹配规则6和规则7,http://localhost/a.XHTML
不会匹配规则7,因为不区分大小写。规则6,规则7属于排除法,符合匹配规则但是不会匹配到用于配置反向代理
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://test.com:8080
}
}
nginx
监听 80
端口,访问localhost
(不加端口号时默认为 80端口)时会跳转到 test.com:8080
(本地的话可以通过在host
文件上设置ip
域名映射) 路径上。
在location
下,同时配置root
和proxy_pass
选项时,两个选项只会二选一执行。
wsgi
模式下的服务器配置访问方式
location / {
include uwsgi_params;
uwsgi_pass localhost:8888
}
负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。
核心配置信息如下:
server host:port
:分发服务器的列表配置-- down
:表示该主机暂停服务-- max_fails
:表示失败最大次数,超过失败最大次数暂停服务-- fail_timeout
:表示如果请求受理失败,暂停指定的时间之后重新发起请求nginx
的负载均衡模块目前支持4种调度算法:
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight
指定轮询权值,Weight
值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
按请求时间逐一分配,如果某个服务器挂了,就自动剔除:
# myserver为自定义的名称
upstream myserver{
server 192.168.1.1:80;
server 192.168.1.12:8080 max_fails=3 fail_timeout=20s;
server 192.168.1.123:8080 down;
}
使用权重:
upstream myserver{
server 192.168.1.1:80 weight=5;
server 192.168.1.12:8080 weight=10;
}
ip_hash
:每个请求按访问IP
的hash
结果分配,这样来自同一个IP
的访客固定访问一个后端服务器,有效解决了动态网页存在的session
共享问题。
比如说用户A
固定ip
,第一次访问到192.168.1.1:80
,那么后面就都是访问到这台机器
upstream myserver{
ip_hash;
server 192.168.1.1:80;
server 192.168.1.12:8080;
}
fair
:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。nginx
本身是不支持fair
的,如果需要使用这种调度算法,必须下载nginx
的upstream_fair
模块。
upstream myserver{
server 192.168.1.1:80;
server 192.168.1.12:8080;
fair;
}
url_hash
:此方法按访问url
的hash
结果来分配请求,使每个url
定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率(同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash
,可以使得同一个url
(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取)。nginx
本身是不支持url_hash
的,如果需要使用这种调度算法,必须安装nginx
的hash
软件包。
upstream myserver{
server 192.168.1.1:80;
server 192.168.1.12:8080;
hash $request_uri;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://myserver;
}
}
注,当负载调度算法为ip_hash
时,后端服务器在负载均衡调度中的状态不能是weight
和backup