概述
main #全局块
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
events { #events块
}
http #http块
{
... #http全局块
include mime.types ;//表示引人的 mime.types 文件是相对于当前配置文件nginx. conf
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 192.168.1.3; #允许的ip
}
}
}
1、全局块:配置影响nginx全局的指令;
2、events块:配置影响nginx服务器或与用户的网络连接。
有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
配置说明
如果你想通过http获取客户的真是ip而不是获取代理服务器的ip地址,那么要做如下的设置。
- proxy_set_header Host $host;
#只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口 www.taobao.com:80
- proxy_set_header X-Real-IP $remote_addr;
#把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;
#代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP
- root /var/www/html
定义服务器的默认网站根目录位置。如果locationURL匹配的是子目录或文件,root没什么作用,一般放在server指令里面或/下。
- index index.jsp index.html index.htm
定义路径下默认访问的文件名,一般跟着root放
- proxy_pass http:/backend
请求转向backend定义的服务器列表,即反向代理,对应upstream负载均衡器。也可以proxy_pass http://ip:port。
- 列出目录 autoindex
Nginx默认是不允许列出整个目录的。如需此功能,打开nginx.conf文件,在location,server 或 http段中加入autoindex on;,
另外两个参数最好也加上去,
autoindex_exact_size off; 默认为on,显示出文件的确切大小,单位是bytes。
改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
常用设置字段
- accept_mutex on|off
unix中有个惊群问题(thundering herd problem),指某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但是只有一个进程可以连接; 如果每次唤醒的进程数目太多,会影响系统性能。nginx多进程下也会出现这个问题;此时设置accept_mutex on, 会对多个nginx进程接收连接进行序列化,防止多个进程对连接的争抢;
- muti_accept on|off
每个nginx的worker process都有能力同时接收多个新到达的网络连接,默认为off,即一次只能接收一个新到达的连接;
-
use select poll kqueue epoll rtsig /dev/poll eventport 事件驱动模型 - keepalive_request number
nigunx和用户端建立会话后,用户端通过此连接发送请求,这个指令用于限制用户通过某一连接向nginx服务器发送请求的次数;
- listen
默认是 listen :80|:8000即监听所有80和8000端口; listen 192.168.1.10 #监听具体ip的所有端口 listen 8000 #监听所有ip的8000端口; listen 192.168.1.111 default_server backlog #默认请求处理,最多允许1024网络同时处于挂起状态;
- root path 配置服务器在指定的根目录查找资源;
- alias path 更改laotion的uri
path是修改后的根路径;例如:location ~ ^/data/(.+.(html|htm))${alias /test/pages/$1}
当location收到/data/index.html请求时,匹配成功,然后根据alias,去/test/pages/查找index.html; - index file 设置网站的默认首页
nginx负载均衡配置
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
upstream mysvr {
server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
server 192.168.101.121 backup;
}
用户和组
Nginx 服务是由一个主进程( master process)和多个 工作进程( worker process)组成 的 。其 中,主进程以 root 权限运行,而 工 作进程在默认情况下以 nobody 用户运行 。原因在 于 nobody 用户是一个不能登录的账号,有一个专用的 ID,可将每个运行的工作进程隔离出 来,这样即使黑客破坏了服务器程序,因其不是 root 用户,也不会影响其他数据 。 因此,为工作进程设置的执行用户权限越低,则服务器安全系数越高
访问控制
Nginx中提供了两个用于配置访问权限控制的指令,分别为 allow 和 deny。
allow 用于设置允许访问的权限、 deny 用于设置禁止访问的权限。
在使用时,权限指令后只需跟上允许或禁止的 P,IP 段或 all 即可 。 其中,all 表示所有的 。
需要特别注意以下几个点 :
- 单个 IP 指定作用范围最小, all 指定作用范围最大 。
- 同一块下,若同时存在多个权限指令( deny、allow) ,则先出现的访问权限设置生效,
并且会对后出现的设置进行破盖,未覆盖的范围依然生效,否则以先出现的设置为准 。
- 当多个块(如 http、server、location)中都出现了权限设置指令,则内层块中的权限级别要比外层块中设置的权限级别高 。
auth_basic on|off 基于密码配置nginx访问权限 auth_basic_user_file file 包含用户信息的文件;
location
location [=|~|~ *|^ ~] URI { ... } #语法类型 1
location @name (... } #语法类型 2
前缀 说明
= 根据其后的指定模式进行精准匹配
~ 使用正则表达式完成 location 的匹配,区分大小写
~* 使用正则表达式完成 location 的匹配,不区分大小写
^~ 不使用正则表达式,nginx找到和请求字符串匹配度最高的location后,立即处理,不在使用正则;
@ 用于定义一个location 块,且该块不能被外部客户端所访问,只能被nginx内部配置指令所访问
因此,当多种类型的 location 匹配同时出现时,最终执行结果为
“= ”匹配 > “ ^~ ”匹配 > 正则匹配 > 普通的最大前缀匹配 。
同级别的只要优先的 location 匹配成功,就不会执行其他的 location。
浏览器会对url编码,^~也会;所以,如果location收到的url为'/html/%20/img',
nginx搜到配置为'^~/html//img'的location时匹配成功;
servername指令的使用
server_name name1 name2 ...;
1.name若使用*,只能出现在首尾;
2.使用正则,要用~作为正则开始的标记;
- 基于端口号配置虚拟主机
listen 8001;
- 基于 IP配置虚拟主机
listen 80;
server_name 192.168.78.4;
- 基于域名配置虚拟主机
#以*通配符开始的字符.
server_name *.test.com;
#以*通配符结束的字符串
server_name www.*;
#匹配正则表达式
server name ~^(?.+)\.domain\.com$ ;
server_name 指令的几种设置方式,在使用中只要有一项匹配成功,则停止继续匹配其他设置,
即统一优先级的多次匹配,首次匹配为准。
且匹配的优先级顺序依次为,精准匹配> 以通配符开始的字符串> 以通配符结束的字符串> 正则表达式 。
阻止处理不明确主机名的请求
客户请求头中,可能会有host不明确的情况,如果不想处理这类请求,可以定义一个默认的server丢弃这类请求;
server{
listen 80 default_server;
server_name _;
return 444;
}
使用不存在的域名_作为服务器名字,并返回444以关闭这个链接;
请求头
add_header name value 为http添加响应头;
只有响应码为200,204,301,302,304时才有效;
需要注意的是除了last-modified头以外,该指令可以在输出的头列表加一个新的头,但是不能重写已经存在的头信息;
root与alias
#收到”/img/itheima.png”请求时,将请求映射为"/var/www/image/itheima.png”
location /img/ {
alias /var/www/image/;
}
#收到”/img/itheima.png”请求时,将请求映射为"/var/www/image/img/itheima.png”
location /img/ {
root /var/www/image/;
}
子配置文件的引入
include file | mask;
在上述语法中, file 用于指定包含的文件名称, mask 用于指定某一路径下的文件,其路 径可以是相对路径,也可以是绝对路径 。
其中,在使用相对路径的情况下,相对的路径是 Nginx 的安装路径下的conf目录 /usr/ local/ nginx/ conf。
常用缓存配置指令
指令 说 明
proxy_cache_bypass 用于配置 Nginx 向客户端发送响应数据时,不从缓存中获取的条件
proxy_cache_lock 用于设置是否开启缓存的锁功能
proxy_cache_lock_timeout 用于设置缓存的锁功能开启以后锁的超时时间
proxy_no_cache 配置在什么情况下不使用缓存功能
proxy_cache_min_uses 当同一个URL被重复请求达到指定的次数后,才对该URL进行缓存
proxy_cache_revalidate 用于当缓存内容过期时,Nginx 通过一次If-Modified-Since的请求头去验证缓存内容是否过期
proxy_cache_use_stale 设置状态,用于内容源Web服务器处于这些状态时, Nginx向客户端响应历史缓存数据
重写与重定向
如果在server级别执行rewrite指令,则请求在location确定前执行,如果被选择的location仍有rewrite指令,同样会被执行; 如果这个location仍有rewrite指令,则会再次改变uri,这种重复周期为10次,10次之后仍找不到具体uri,nginx返回500;
rewrite regex replacement [flag] ; flag可选参数值: 参数值 说明 last 终止在本location块中处理接收的uri,并将此处重写的uri作为新的uri,使用各location继续处理; break 终止rewrite,不再继续匹配 redirect 临时重定向,返回的HTTP状态码为302 permanent 永久重定向,返回的HTTP状态码为301 if(!-e $request_filename) { rewrite ”^/.*" /default/default.html break; }
set name value 用于设置一个新的变量;name要以$开头,且不能和nginx预设的全局变量同名。
rewrite 常用全局变量
变量 说明
$args 存放url的参数部分,如http://aa.com?a=1&b=2中的a=1&b=2
$content_length 存放请求头中的Content_Length字段
$content_type 存放请求头中的Content_Type字段
$document_root 存放针对当前请求的根路径
$document_uri 存放请求中的当前uri,不包括参数部分,如http://aa.com/path?a=1&b=2中的/path
$host 请求信息中的host头信息,url的主机部分,如http://aa.com/path中的aa.com,
如果请求中主机字段不可用或者为空,则存放该server块中server_name的值
$http_host 同$host,但是如果请求host为空,则为空;
$http_user_agent 浏览器信息
$http_cookie cookie
$http_x_forwarded_for 网络访问路径
$is_args 如果有$args有值,则等于”?“,否则=空
$limit_rate 存放nginx服务器对网络连接速率的限制;即nginx配置中limit_rate的值;
$remote_addr 客户端地址
$remote_port 端口号
$remote_user 客户端用户名
$request 客户端请求
$request_body_file 发给服务器的本地文件
$request_method 客户端的请求方式
$request_filename 当前请求的资源文件的路径名
$request_uri 当前请求的uri,带参数
$query_string url参数部分
$scheme 协议
$server_protocol 协议版本
$server_addr 服务器地址
$server_name 服务器名称
$server_port 服务器端口号
$uri 同$document_uri
if指令判断符号
判断符号 说明
= 判断变量与内容相等
~ 区分大小写正则匹配
!~ 区分大小写正则不匹配
~* 不区分大小写正则匹配
-f 判断文件存在
-d 判断目录存在
-e 判断文件或目录存在
-x 判断可执行文件
正则表达式字符串一般不需要加引号,但如果含有}或者;时,必须给整正则表达式加引号;
valid_referers 配置图片防盗链
location ~ * \.(gif|jpg|png|swf|flv)$ {
valid_referers www.ng.test ng.test;
if($invalid referer){
return 403;
}}}
valid_referers 指令的参数可以叠加设置,中间使用空格分隔即可 。
valid_referers指令后可以设置的参数值以及相关说明如表
参数值 说明
none 匹配没有 Referer 的 HTTP 请求,如 valid_referers none;
blocked 匹配 HTTP 请求中含有 Referer,但是被防火墙或者代理服务器修改,
去掉了https://或 http://的情况,如 valid_referers blocked;
server names 允许文件资源链出的域名白名单,如 valid_referers www.ng.test ng.test;
string 任意的字符串,如 valid_referers *.ng.test bxg.* ;
regular expression 正则表达式,如 valid_referers ~\.img\.;
日志文件
log_format指令进行自定义;
存储路径、缓存大小等可使用access_log 指令设置。
通过访问日志的配置,可以记录用户 IP、访问时间、请求方式、响应状态、地域来源、跳转来源、使用终端等信息。
与日志格式相关的内置变量:
内置变量 说明
$remote_addr 客户端的 IP 地址
$remote user 客户端用户名,用于记 录浏览者进行身份验证时提供的名称,如果没有登录则为空
$time local 访问的时间与时区,如21/Sep/2016:12:21,25 +0800,时间信息最后的+0800表示服务器所处时区位于UTC 之后的8小时
$request 请求的 URI 和 HTTP 协议
$status 记录请求返回的 HTTP 状态码
$body_bytes_sent 发送给客户端的文件主体内容的大小
$http_referer 来路 URL 地址
$http_user_agent 客户端浏览器信息
$http_x_forwarded for 客户端 IP 地址列表(包括中间 经 过的代理 )
错误日志是由 error_log 指令设置的,主要是用来记录客户端在访问 Nginx 时出错的记 录,且该错误显示格式不支持自定义功能。
关闭访问日志:access_log off;
关闭错误日志:error_log /dev/null;
错误页面
- 自定义错误页面的大小必须大于512字节,否则错误页面的展示将使用 IE 默认的错误页面 。
error_page code [=response] uri
uri 错误页面的路径或者网站地址,如果是路径,则以nginx安装路径下html目录为根路径的相对路径;
errr_page 500 502 503 504 /50x.html;
1.为每种类型的错误设置单独的处理方式
#指定网站极目呆下的页商 40x.html,处琦 403错误
errr_page 403 /40x.html ;
40x.html在nginx安装路径/html/40x.html
#指定网站根目录下的网片 404.j间,处理 404错误
error_page 404 /404 . jpg;
2.利用在线资源进行处理错误
error_page 403 http://example.com/forbidden.html;
3.更改晌应状态码
要隐藏服务器返回的真实状态码信息,则可以利用=进行自定义设置,如:
error_page 404 =301 /301.html;
在发生404错误时,返回301状态码,使用nginx安装路径/html/301.html页面展示,
另外,更改响应状态码时还可以不指定确切的码值,而是由重定向后实际处理的真实结果来决定 。
以上,uri实际上是一个相对于nginx服务器安装路径的相对路径。
如果不想把错误页面放在安装路径下,可以使用location定向;如:
error_page 404 /404.html ;
location /404.html{root /yourpath/}