1、Nginx虚拟主机配置
nginx一个虚拟主机使用一个serer{}配置,可以同时配置多个server。
例如:配置 和
配置如下:
user nginx;worker_processes 1;worker_rlimit_nofile 65535;events { worker_connections 2048;}http { include mime.types; default_type application/octet-stream; server { listen 80; server_name www.a.com; } server { listen 80 default_server; server_name www.b.org; root /www/b.org; }}
在本机hosts文件中添加解析记录
172.16.42.180 www.a.com172.16.42.180 www.b.org
分别访问 和
2、nginx基于IP地址,使用access模块做访问控制
nginx访问控制用deny和allow两个指令来控制,例如修改
server { listen 80 default_server; server_name www.b.org; root /www/b.org; deny 172.16.42.1; allow 172.16.0.0/16; deny all; }
172.16.42.1 是Mac的IP,再次访问被拒绝
3、基于用户的访问控制
如果nginx想基于用户做访问控制,在需要在server{}中增加以下配置:
local url { root path; auth_basic "admin area"; auth_basic_user_file /etc/nginx/.htpasswd;}
auth_basic:表示为什么做访问控制,
auth_basic_user_file:作访问控制使用的账户密码文件。可以使用htpasswd 命令来创建
测试:
修改
server { listen 80 default_server; server_name www.b.org; root /www/b.org; location /admin/ { root /www/b.org; auth_basic "admin area"; auth_basic_user_file /etc/nginx/.htpasswd; } }
创建密码文件: 第一次创建时使用"-c"参数
htpasswd -c -m /etc/nginx/.htpasswd tomhtpasswd -m /etc/nginx/.htpasswd paul
reload下nginx,测试访问
4、建立下载站点时,使用autoindex模块, 自动列出所有目录和文件
配置方法:在server{}, 配置中加入以下配置:
location /download { root /www/b.org; autoindex on;}
例如:修改
server { listen 80 default_server; server_name www.b.org; root /www/b.org; location /download { root /www/b.org; autoindex on; } }
5、URL rewrite
rewrite regex replacement [flag];
flag: 标志位,包含以下选项:
last:一旦被当前规则匹配并重写后立即停止检查后续的其他rewrite的规则,而通过重写后的规则重新发起请求;
break:一旦被当前规则匹配并重写后立即停止后续的其他rewrite的规则,而后继续由nginx进行后续操作;
redirect: 返回302临时重定向;
permanent:返回301永久重定向;
注意:一般将rewrite写在location中时都使用break标志,或者将rewrite写在if上下文中;
例1:
location / { root /www/b.org; rewrite ^/images/(.*)$ /imgs/$1;}
解释:如果访问的uri是以images开头,后面是任意内容的,则重写为/images/任意内容
例如: 访问http://www.b.org/images/a.jpg 会被重写成http://www.b.org/imgs/a.jpg
例2:
location /download/ { root /www/b.org/; rewrite ^/download/(.*\.(jpg|gif|jpeg|png))$ /images/$1 last; }
解释:访问/download/下任意以jpg等图片格式结尾的uri时,跳转到/images/路径下对应的文件路径
PS:图片实际路径是/www/b.org/images/1.jpg
修改www.b.org的配置
location /download { root /www/b.org; rewrite ^/download/(.*\.(jpg|gif|jpeg|png))$ /images/$1 last;}
访问download下的html文件,则不会重写
6、rewrite_log on | off;
是否把重写过程记录在错误日志中,默认为notice级别, 该功能默认是关闭的,在繁忙的服务器上这个功能建议关闭
例如:修改
location /download { root /www/b.org; rewrite ^/download/(.*\.(jpg|gif|jpeg|png))$ /images/$1 last; rewrite_log on; }
开启error_log日志配置:
error_log /var/log/nginx/error.log notice;
保存reload nginx配置,再次访问 ,查看/var/log/nginx/error.log日志文件,发现rewrite日志记录到错误日志文件中了
tail /var/log/nginx/error.log 2018/05/14 16:01:53 [notice] 1537#0: *41 "^/download/(.*\.(jpg|gif|jpeg|png))$" does not match "/download/1.jps", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jps HTTP/1.1", host: "www.b.org"2018/05/14 16:01:53 [error] 1537#0: *41 open() "/www/b.org/download/1.jps" failed (2: No such file or directory), client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jps HTTP/1.1", host: "www.b.org"2018/05/14 16:01:57 [notice] 1537#0: *41 "^/download/(.*\.(jpg|gif|jpeg|png))$" matches "/download/1.jpg", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"2018/05/14 16:01:57 [notice] 1537#0: *41 rewritten data: "/images/1.jpg", args: "", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"2018/05/14 16:01:58 [notice] 1537#0: *41 "^/download/(.*\.(jpg|gif|jpeg|png))$" matches "/download/1.jpg", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"2018/05/14 16:01:58 [notice] 1537#0: *41 rewritten data: "/images/1.jpg", args: "", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"2018/05/14 16:01:59 [notice] 1537#0: *41 "^/download/(.*\.(jpg|gif|jpeg|png))$" matches "/download/1.jpg", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"2018/05/14 16:01:59 [notice] 1537#0: *41 rewritten data: "/images/1.jpg", args: "", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"2018/05/14 16:01:59 [notice] 1537#0: *41 "^/download/(.*\.(jpg|gif|jpeg|png))$" matches "/download/1.jpg", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"2018/05/14 16:01:59 [notice] 1537#0: *41 rewritten data: "/images/1.jpg", args: "", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"
7、return code;
用于结束rewrite规则,并且为客户返回状态码,可以使用的状态码有204,400,402-406,500-504等
8、防盗链配置
location ~* \.(jpg|png|gif|jpeg)$ { root /www/b.org; valid_referers none blocked www.b.org *.b.org; if ($invalid_referer) { rewrite ^/ http://www.b.org/403.html; }}
9、ssl配置,使用https相关配置
server { ssl on; ssl_certificate cert.pem; //证书保存路径 ssl_certificate_key cert.key; //私钥保存的路径 ssl_session_timeout 5m; //会话超时时长5分钟,时间根据实际情况调整 ssl_prefer_server_ciphers on; //服务器自己选择加密算法}
10、nginx状态页面配置
location /server-status { stub_status on; access_log off; //不记录日志到访问日志中,防止信息泄露 allow 172.16.42.0/24; //出于安全考虑,基于IP做访问控制 deny all; }
active connection:所有的活动连接
server accepts handled requests: 服务器已经接受或处理过的请求数,
有三个数:第一个116表示nginx已经接收到的请求数
第二个116表示nginx已经处理过的请求数,请求还没有closed
第三个313表示正在处理的连接数
下面三个数当前正在处理的请求:
Reading:正在读取客户端请求的请求数
Writing: 请求主体已经获取了,准备响应请求
Waiting: 保持连接的请求数, Waiting = Active - (Reading + Writing)
11、upstream配置
先看下官方给出example 配置样例
Example Configuration
upstream backend { server backend1.example.com weight=5; server backend2.example.com:8080; server unix:/tmp/backend3; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup;}server { location / { proxy_pass http://backend; }}
参数设置:
weight=number 设置服务器的权重,默认为1
max_fails=number 设置在fail_timeout 时间内不成功的尝试次数,判断此机器是否可用,默认尝试次数为1
fail_timeout=time 设置判断机器是否可用尝试的时间,默认时间为10s
backup 标明此机器为备份机器,当主机器不可用的时候起作用。
down 标明此机器不可用。
max_conns=number 限制代理服务器的最大连接数。默认值为0,也就是没有限制
resolve 监听ip地址以及对应的服务器域名的改变,自动修改配置,不用重启nginx.
route=string 设置服务器的路由名称
slow_start=time 设置服务器权重从0恢复到标准值的时间,默认值为0
upstream配置使用样例:
在nginx本机安装httpd,并修改apache默认欢迎页面监听端口为8080,然后启动httpd服务,然后在nginx中增加以下配置
upstream backend { server 127.0.0.1:8080;}server { listen 80; server_name www.test.cc; location / { proxy_pass http://backend; root /www/a.com; index index.html index.htm; }}
访问