一 、操做命令php
sudo nginx #打开 nginx
nginx -s reload|reopen|stop|quit #从新加载配置|重启|中止|退出 nginx
nginx -t #测试配置是否有语法错误html
建议 使用 nginx -s quit 待nginx进程处理任务完毕进行中止node
nginx -t -c /etc/nginx/nginx.confnginx
nginx -s reload -c /etc/nginx/nginx.confweb
nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]正则表达式
-?,-h : 打开帮助信息
-v : 显示版本信息并退出
-V : 显示版本和配置选项信息,而后退出
-t : 检测配置文件是否有语法错误,而后退出
-q : 在检测配置文件期间屏蔽非错误信息
-s signal : 给一个 nginx 主进程发送信号:stop(中止), quit(退出), reopen(重启), reload(从新加载配置文件)
-p prefix : 设置前缀路径(默认是:/usr/local/Cellar/nginx/1.2.6/)
-c filename : 设置配置文件(默认是:/usr/local/etc/nginx/nginx.conf)
-g directives : 设置配置文件外的全局指令后端
2、配置详解api
# user字段代表了Nginx服务是由哪一个用户哪一个群组来负责维护进程的,默认是nobody # 我这里用了cainengtian用户,staff组来启动并维护进程 # 查看当前用户命令: whoami # 查看当前用户所属组命令: groups ,当前用户可能有多个所属组,选第一个便可 user cainengtian staff; # worker_processes字段表示Nginx服务占用的内核数量 # 为了充分利用服务器性能你能够直接写你本机最高内核 # 查看本机最高内核数量命令: sysctl -n hw.ncpu worker_processes 4; # error_log字段表示Nginx错误日志记录的位置 # 模式选择:debug/info/notice/warn/error/crit # 上面模式从左到右记录的信息从最详细到最少 error_log /usr/local/var/logs/nginx/error.log debug; # Nginx执行的进程id,默认配置文件是注释了 # 若是上面worker_processes的数量大于1那Nginx就会启动多个进程 # 而发信号的时候须要知道要向哪一个进程发信息,不一样进程有不一样的pid,因此写进文件发信号比较简单 # 你只须要手动建立,好比我下面的位置: touch /usr/local/var/run/nginx.pid pid /usr/local/var/run/nginx.pid; events { # 每个worker进程能并发处理的最大链接数 # 看成为反向代理服务器,计算公式为: `worker_processes * worker_connections / 4` # 看成为HTTP服务器时,公式是除以2 worker_connections 2048; } http { # 关闭错误页面的nginx版本数字,提升安全性 server_tokens off; include mime.types; default_type application/octet-stream; # 日志记录格式,若是关闭了access_log能够注释掉这段 #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可让读取磁盘IO操做更快 # 固然若是你在学习的过程当中能够打开方便查看Nginx的访问日志 access_log off; sendfile on; # 在一个数据包里发送全部头文件,而不是一个接一个的发送 tcp_nopush on; # 不要缓存 tcp_nodelay on; keepalive_timeout 65; gzip on; client_max_body_size 10m; client_body_buffer_size 128k; # 关于下面这段在后面紧接着来谈! include /usr/local/etc/nginx/sites-enabled/*; }
server { # Nginx监听端口号 listen 80; # 服务器的名字,默认为localhost,你也能够写成aotu.jd.com,这样子就能够经过aotu.jd.com来访问 server_name localhost; # 代码放置的根目录 root /var/www/; # 编码 charset utf-8; location / { # index字段声明了解析的后缀名的前后顺序 # 下面匹配到/的时候默认找后缀名为php的文件,找不到再找html,再找不到就找htm index index.php index.html index.htm; # 自动索引 autoindex on; # 这里引入了解析PHP的东西 include /usr/local/etc/nginx/conf.d/php-fpm; } # 404页面跳转到404.html,相对于上面的root目录 error_page 404 /404.html; # 403页面跳转到403.html,相对于上面的root目录 error_page 403 /403.html; # 50x页面跳转到50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
# 当用root配置的时候,root后面指定的目录是上级目录 # 而且该上级目录必须含有和location后指定的名称的同名目录,不然404 # root末尾的"/"加不加无所谓 # 下面的配置若是访问站点http://localhost/test1访问的就是/var/www/test1目录下的站点信息 location /test1/ { root /var/www/; } # 若是用alias配置,其后面跟的指定目录是准确的,而且末尾必须加"/",不然404 # 下面的配置若是访问站点http://localhost/test2访问的就是/var/www/目录下的站点信息 location /test2/ { alias /var/www/; }
3、临时重定向缓存
location /o2blog_wx/ { # 当匹配到http://aotu.jd.com/o2blog_wx/的时候会跳转到http://aotu.jd.com/wxblog return 302 http://aotu.jd.com/wxblog }
在一台服务器上的资源不所有都是对外开放的,这个时候就须要经过Nginx
配置一个限制访问,好比查看本服务器的PHP
信息,咱们就能够经过下面配置来实现限制访问:安全
# 当匹配到/info的时候只容许10.7.101.224访问,其它的所有限制 # 同时改写为/info.php location = /info { allow 10.7.101.224; deny all; rewrite (.*) /info.php }
这个时候只有IP
为10.7.101.224
的机器才能够访问:aotu.jd.com/info,其它机器都会…
固然最佳的实践是将IP
抽取出来变成白名单,这样子就能够实现部分IP
能够访问,其它的不能访问。
5、优先级
一、多个server_name
若是多个文件配置有相同的 server_name ,根据文件名先读取到哪一个文件就加载哪一个文件的配置
二、location
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,中止匹配,按当前匹配规则处理请求。
HTTP
能够嵌套多个server
,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
配置参数属性 | 解释说明 | 参数列表 |
---|---|---|
include | 主模块指令,实现对配置文件所包含的文件的设定,能够减小主配置文件的复杂度,DNS主配置文件中的zonerfc1912,acl基本上都是用include语句 | |
default_type | 核心模块指令 | 默认设置为二进制流,也就是当文件类型未定义时使用这种方式 |
log_format | 日志格式的设定 | 日志格式的名称,可自行设置,后面引用 |
access_log | 引用日志 | 引用log_format设置的名称 |
keepalive_timeout | 设置客户端链接保存活动的超时时间 | 0是无限制 |
sendfile | 开启高效文件传输模式 | on / off |
tcp_nopush | 开启防止网络阻塞 | on / off |
tcp_nodelay | 开启防止网络阻塞 | on / off |
upstream | 负载均衡 | |
server | Nginx的server虚拟主机配置 |
Upstream
它的做用是实如今轮询和客户端IP之间的后端服务器负荷平衡。
配置参数属性 | 解释说明 |
---|---|
轮询(默认) | 当weight不指定时,各服务器weight相同,每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。 |
weight | 指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况 |
ip_hash | 每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。 |
fair(第三方) | 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 |
url_hash(第三方) | 按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 |
weight
默认为1.weight
越大,负载的权重就越大。
Nginx Upstream
状态例如:
upstream news {
server 127.0.0.1:9527 backup;
server 127.0.0.1:9527 weight=1 max_fails=2 fail_timeout=3;
...
}
复制代码
配置参数属性 | 解释说明 |
---|---|
backup | 预留的备份服务器 |
down | 当前的server暂时不参与负载均衡 |
fail_timeout | 通过max_fails 失败后,服务暂停的时间 |
max_conns | 限制最大的接收的链接数 |
max_fails | 容许请求失败的次数 |
use location
:在server
中添加
proxy_pass http://127.0.0.1:9527;
// 由于个人API接口是这个,such as /api/profile
// location 具体匹配规则详见后面
location ~ /api/ {
proxy_pass http://127.0.0.1:9527;
}
复制代码
Server
配置虚拟主机的相关参数,一个http
中能够有多个server
。
配置参数属性 | 解释说明 | 参数列表 |
---|---|---|
listen | 监听端口 | http -> 80 / https -> 443 |
server_name | 设置主机域名 | localhost |
charset | 设置访问的语言编码 | |
access_log | 设置虚拟主机访问日志的存放路径及日志的格式 | |
location | 设置虚拟主机的基本信息 |
Location
配置请求的路由,以及各类页面的处理状况。
配置参数属性 | 解释说明 | 参数列表 |
---|---|---|
root | 设置虚拟主机的网站根目录 | Vue项目的根目录/Users/rainy/Desktop/MyWork/Work/cloudwiz-website/dist |
index | 设置虚拟主机默认访问的网页 | index.html index.htm |
proxy | 经过不一样协议将请求从NGINX传递到代理服务器 |
=
: 开头表示精确匹配,如 api
中只匹配根目录结尾的请求,后面不能带任何字符串.^~
:开头表示uri
以某个常规字符串开头,不是正则匹配.~
: 开头表示区分大小写的正则匹配.~*
: 开头表示不区分大小写的正则匹配./
: 通用匹配, 若是没有其它匹配,任何请求都会匹配到.匹配优先级(高到低)
location =
location 完整路径
location ^~ 路径
location ~,~* 正则顺序
location 部分起始路径
/
Reverse Proxy
当NGINX
代理请求时,它会将请求发送到指定的代理服务器,获取响应并将其发送回客户端。可使用指定的协议将请求代理到HTTP
服务器(另外一个NGINX
服务器或任何其余服务器)或非HTTP
服务器(能够运行使用特定框架(如PHP
或Python
)开发的应用程序)。
location / some / path / {
proxy_pass http://www.example.com:8080;
proxy_set_header Host $ host ;
proxy_set_header X-Real-IP $ remote_addr ;
// 禁用特定位置的缓冲
proxy_buffering off ;
proxy_buffers 16 4k ;
proxy_buffer_size 2k ;
proxy_bind 127.0.0.2 ; // IP地址也能够用变量指定
}
复制代码
将请求传递给非HTTP
代理服务器,**_pass
应使用相应的指令:
fastcgi_pass
将请求传递给FastCGI服务器uwsgi_pass
将请求传递给uwsgi服务器scgi_pass
将请求传递给SCGI服务器memcached_pass
将请求传递给memcached服务器配置参数属性 | 解释说明 | 参数列 |
---|---|---|
proxy_pass | 将请求传递给HTTP代理服务器 | |
proxy_set_header | 传递请求标头 | 默认状况下,NGINX在代理请求中从新定义两个头字段“Host”和“Connection”,并删除其值为空字符串的头字段。“Host”设置为$proxy_host 变量,“Connection”设置为close 。 |
proxy_buffering |
负责启用和禁用缓冲 | on / off |
proxy_buffers | 请求分配的缓冲区的大小和数量 | |
proxy_buffer_size | 代理服务器的响应的第一部分存储在单独的缓冲区大小 | 一般包含一个相对较小的响应头,而且能够比其他响应的缓冲区小。 |
proxy_bind | 接受来自特定IP网络或IP地址范围的链接 | 指定proxy_bind 必要网络接口的指令和IP地址 |
Global Variable
变量名 | 变量含义 |
---|---|
$args | 请求中的参数 |
$content_length | HTTP 请求信息里的Content-Length |
$content_type | 请求信息里的Content-Type |
$host | 请求信息中的Host ,若是请求中没有Host 行,则等于设置的服务器名 |
$http_cookie | cookie 信息 |
$http_referer | 引用地址 |
$http_user_agent | 客户端代理信息 |
$remote_addr | 客户端地址 |
$remote_port | 客户端端口号 |
$remote_user | 客户端用户名,认证用 |
$request_method | 请求的方法,好比GET 、POST 等 |
$request_uri | 完整的原始请求URI (带参数) |
$scheme | 请求方案,http 或https |
$server_addr | 接受请求的服务器的地址,若是没有用listen 指明服务器地址,使用这个变量将发起一次系统调用以取得地址(形成资源浪费); |
$server_protocol | 请求的协议版本,HTTP/1.0 或HTTP/1.1 |
$uri | 请求中的当前URI , $uri 在请求处理期间 ,值可能会发生变化,例如在执行内部重定向或使用索引文件时 |
index
语法:index file ...;
默认为index index.html;
index
指令指定了被做为index的文件,好比上面的index.html
可是在下面这种状况下,对/index.html
的请求将会被第二个location block
处理,由于第一个与/index.html
并非彻底匹配。
location = / { index index.html; } location / { ... }
try_files
root /var/www/main;location / { try_files $uri $uri.html $uri/ /fallback/index.html; } location /fallback { root /var/www/another; }
对/page
的请求将会首先进入第一个location, 而后尝试在/var/www/main
下依次查找page
, page.html
, page/
,若是都没有找到的话将会被重定向到/fallback/index.html
,并由第二个location提供/var/www/another/fallback/index.html
rewrite
经过Perl兼容的正则表达式改变请求的URI,语法:rewrite regex replacement [flag];
flag的值能够是:
last
结束当前的rewrite指令,并用修改过的URI去匹配其余的location block
。
break
结束当前的rewrite指令。
redirect
当替换的URI(replacement
)不以 “http://”
,“https://”
, “$scheme”
开头时进行状态码为302的暂时性的重定向。
permanent
返回一个状态码为301的永久重定向。
error_page
root /var/www/main; location / { error_page 404 /another/whoops.html; } location /another { root /var/www; }
除了/another
以外的请求都会在/var/www/main
查找请求的资源,若是没有找到相关资源将会重定向到/another/whoops.html
,由第二个location block
处理,查找/var/www/another/whoops.html