nginx主配置文件 nginx.conf
配置文件结构如下:
worker_process # 表示工作进程的数量, 一般设置为cpu的核数
worker_connections # 表示每个工作进程的最大连接数
server{} # 块定义了虚拟主机
listen # 监听端口
server_name # 监听域名
location {} # 是用来为匹配的 URI 进行配置, URI 即语法中的“/uri/”
location /{} # 匹配任何查询, 因为所有请求都以 / 开头
root # 指定对应uri的资源查找路径, 这里html为相对路径, 完整路径为
# /opt/nginx-1.7.7/html/
index # 指定首页index文件的名称, 可以配置多个, 以空格分开。 如有多
# 个, 按配置顺序查找。
location匹配规则
语法规则
location [=|~|~*|^~] /uri/ { … }
模式 | 含义 |
---|---|
location = /uri | = 表示精确匹配, 只有完全匹配上才能生效 |
location ^~ /uri | ^~ 开头对URL路径进行前缀匹配, 并且在正则之前。 |
location ~ pattern | 开头表示区分大小写的正则匹配 |
location ~* pattern | 开头表示不区分大小写的正则匹配 |
location /uri | 不带任何修饰符, 也表示前缀匹配, 但是在正则匹配之后 |
location / | 通用匹配, 任何未匹配到其它location的请求都会匹配到, 相当于switch中的default |
rewrite语法
- last : 基本上都用这个 Flag
- break : 中止 Rewirte, 不再继续匹配
- redirect : 返回临时重定向的 HTTP 状态 302
- permanent : 返回永久重定向的 HTTP 状态 301
- 下面是可以用来判断的表达式:
-f 和 !-f 用来判断是否存在文件
-d 和 !-d 用来判断是否存在目录
-e 和 !-e 用来判断是否存在文件或目录
-x 和 !-x 用来判断文件是否可执行
- 下面是可以用作判断的全局变量
例: http://localhost:88/test1/test2/test.php?k=v
$host: localhost
$server_port: 88
$request_uri: /test1/test2/test.php?k=v
$document_uri: /test1/test2/test.php
$document_root: D:\nginx/html
$request_filename: D:\nginx/html/test1/test2/test.php
redirect语法
server {
listen 80;
server_name start.igrow.cn;
index index.html index.php;
root html;
if ($http_host !~ "^star\.igrow\.cn$") {
rewrite ^(.*) http://star.igrow.cn$1 redirect;
}
}
防盗链
location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}
根据文件类型设置过期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}
禁止访问某个目录
location ~* \.(txt|doc)${
root /data/www/wwwroot/linuxtone/test;
deny all;
}
使用if指令测试一个变量
if ($request_method = POST) {
return 405;
}
if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
}
最佳实践: 在if
指令块内,最好只有 return ...; rewrite ... last;
指令。其他指令执行不一定会是预期的结果。
静态文件服务
server {
listen 80;
server_name www.test.com;
charset utf-8;
root /data/www.test.com;
index index.html index.htm;
}
日志
access_log 访问日志
默认的访问日志:
log_format combined '$remote_addr - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';
access_log中可用字段如下:
字段 | 作用 |
---|---|
$remote_addr与 $http_x_forwarded_for | 记录客户端IP地址 |
$remote_user | 记录客户端用户名称 |
$request | 记录请求的URI和HTTP协议 |
$status | 记录请求状态 |
$body_bytes_sent | 发送给客户端的字节数, 不包括响应头的大小 |
$bytes_sent | 发送给客户端的总字节数 |
$connection | 连接的序列号 |
$connection_requests | 当前通过一个连接获得的请求数量 |
$msec | 日志写入时间。 单位为秒, 精度是毫秒 |
$pipe | 如果请求是通过HTTP流水线(pipelined)发送, pipe值为“p”, 否则为“.” |
$http_referer | 记录从哪个页面链接访问过来的 |
$http_user_agent | 记录客户端浏览器相关信息 |
$request_length | 请求的长度( 包括请求行, 请求头和请求正文) |
$request_time | 请求处理时间, 单位为秒, 精度毫秒 |
$time_iso8601 | ISO8601标准格式下的本地时间 |
$time_local | 记录访问时间与时区 |
error_log 错误日志
error_log 主要记录客户端访问 Nginx 出错时的日志, 格式不支持自定义。
error_log 指令用来指定错误日志, 语法: error_log path [level] ;
反向代理
反向代理( Reverse Proxy) 方式是指用代理服务器来接受网络的连接请求, 然后将请求转发给内部网络上的服务器, 并将从服务器上得到的结果返回给网络请求连接的客户端, 此时代理服务器对外就表现为一个反向代理服务器。
负载均衡
upstream 负载均衡概要
配置如下:
upstream test.net{
ip_hash;
server 192.168.10.13:80;
server 192.168.10.14:80 down;
server 192.168.10.15:8009 max_fails=3 fail_timeout=20s;
server 192.168.10.16:8080;
}
server {
location / {
proxy_pass http://test.net;
}
}
upstream支持的负载均衡算法
- 轮询( 默认) : 每个请求按时间顺序逐一分配到不同的后端服务器, 如果后端某台服务器宕机, 故障系统被自动剔除, 使用户访问不受影响。 Weight 指定轮询权值, Weight 值越大, 分配到的访问机率越高, 主要用于后端每个服务器性能不均的情况下。
- ip_hash: 每个请求按访问 IP 的 hash 结果分配, 这样来自同一个 IP 的访客固定访问一个后端服务器, 有效解决了动态网页存在的 session 共享问题。
- fair: 这是比上面两个更加智能的负载均衡算法。 此种算法可以依据页面大小和加载时间长短智能地进行负载均衡, 也就是根据后端服务器的响应时间来分配请求, 响应时间短的优先分配。 Nginx 本身是不支持 fair 的, 如果需要使用这种调度算法, 必须下载 Nginx的 upstream_fair 模块。
- url_hash: 此方法按访问 url 的 hash 结果来分配请求, 使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。 Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法, 必须安装 Nginx 的 hash 软件包。
- least_conn: 最少连接负载均衡算法, 简单来说就是每次选择的后端都是当前最少连接的一个 server(这个最少连接不是共享的, 是每个 worker 都有自己的一个数组进行记录后端 server 的连接数)。
- hash: 这个 hash 模块又支持两种模式 hash, 一种是普通的 hash, 另一种是一致性hash(consistent)
upstream支持的状态参数
- down: 表示当前的 server 暂时不参与负载均衡。
- backup: 预留的备份机器。 当其他所有的非 backup 机器出现故障或者忙的时候, 才会请求 backup 机器, 因此这台机器的压力最轻。
- max_fails: 允许请求失败的次数, 默认为 1 。 当超过最大次数时, 返回proxy_next_upstream 模块定义的错误。
- fail_timeout: 在经历了
max_fails
次失败后, 暂停服务的时间。max_fails
可以和 - fail_timeout 一起使用。
配置nginx负载均衡
upstream webservers {
server 192.168.18.201 weight=1;
server 192.168.18.202 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://webservers;
proxy_set_header X-Real-IP $remote_addr;
}
}
注, upstream 是定义在 server{ } 之外的, 不能定义在 server{ } 内部。 定义好 upstream之后, 用 proxy_pass 引用一下即可.
配置nginx进行健康状态检查
利用 max_fails、 fail_timeout 参数, 控制异常情况
upstream webservers {
server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
}
配置backup服务器
当所有服务器都不能提供服务,给用户展示提示错误的页面:
server {
listen 8080;
server_name localhost;
root /data/www/errorpage;
index index.html;
}
负载均衡配置:
upstream webservers {
server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
server 127.0.0.1:8080 backup;
}
配置ip_hash负载均衡
upstream webservers {
ip_hash;
server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
}