Nginx是一个高性能的HTTP和反向代理服务器
Nginx配置模块
Nginx配置分为各个配置块,主配置块负责全局配置,子配置块可以继承全局配置,也可以相应的配置不同设置。
main block:主配置(全局配置)
event{
... }事件驱动相关配置块
http{
... }http/https 协议相关的配置块
mail{
... }邮件服务器相关的配置块
stream{
... }流服务器相关的配置块
location 匹配规则
url匹配规则如下:
= 精确匹配
^~ 普通字符匹配, 区分大小写
~ 正则匹配,区分大小写
/xxx/yyy.zzz 最长匹配,区分大小写
/
location规则优先级顺序为: = > ^~ > ~ > /xxx/yyy.zzz > /
一、 常见的负载均衡
负载均衡应该是Nginx使用最多的几个配置之一。
1. 循环(round-robin)
最简单的一种配置方式,会将所有的请求依次分配给一个服务器。 比如:第一次访问,:port/demo返回服务器1,第二次返回服务器2。
http {
upstream www.zx.com {# 这里可以写域名、IP或是随意一个名词
server 127.0.0.1:8001; # 服务器1
server 127.0.0.1:8002; # 服务器2
}
server {
location /demo {# 访问 http://ip:port/demo
proxy_pass http://www.zx.com;
}
}}
2. 最少连接(least-connected)
Web请求会被转发到连接数最少的服务器上
http {
upstream www.zx.com {
least_conn; # 表示启动least-connected模式
server 127.0.0.1:8001; # 服务器1
server 127.0.0.1:8002; # 服务器2
}
server {
location /demo {
proxy_pass http://www.zx.com;
}
}}
3. IP哈希(ip-hash)
IP哈希具有站粘性,会将同一个客户端的请求始终分配给一台服务器,在没有实现服务器间session共享的时候,可以选择使用IP哈希。
http {
upstream www.zx.com {
ip_hash; # 表示启动ip_hash模式
server 127.0.0.1:8001; # 服务器1
server 127.0.0.1:8002; # 服务器2
}
server {
location /demo {
proxy_pass http://www.zx.com;
}
}}
4. 权重(weight)
weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 比如,weight=9 和 1,实际情况是,ngnix的第1~9个请求访问服务器1, 第10个请求访问服务器2。之后循环这个规律
http {
upstream www.zx.com {# 这里可以写域名、IP或是随意一个名词
server 127.0.0.1:8001 weight=9; # 服务器1
server 127.0.0.1:8002 weight=1; # 服务器2
}
server {
location /demo { # 访问 http://ip:port/demo
proxy_pass http://www.zx.com;
}
}}
二、 Nginx反向代理1. 代理URL/域名
location /account { # 代理本地
proxy_pass http://127.0.0.1:8080/account;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;} location /blog {
proxy_pass http://localhost:4000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location / { #代理域名,配置方式不同于本地
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Headers "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With";
proxy_pass http://zx19890628.gitee.io/;
proxy_read_timeout 120s;# 代理服务器最大响应时间 }
2. 代理本地静态文件
expires过期时间,使静态文件可以缓存到Nginx中。 alias 将要开放的目录,结尾必须使用/,用来代替root 之后访问: :8080/img/1.jpg。即可访问F:/壁纸/1.jpg。
location /img/ {
expires 24h;
alias F:/壁纸/;
}
3. 代理多个域名
多个域名指向同一个机器。使用Nginx解析到不同的目录
有的时候, 一台机器上需要为多个不同的域名运行不同的站点。
比如: 作为博客,作为论坛。
第一步: 在DNS解析中设置这两个域名, 设置记录值均为机器的IP。比如下图为某个域名的解析配置
第二步:配置好之后,通过域名都能访问到机器的默认端口。但是机器没法知道某个域名访问的是哪个网站。这时候,你就需要使用虚拟目录了。假设你把博客放在”/home/user/www/blog”下,论坛放在”/home/user/www/forum”下。
假设: Nginx安装目录是在: /usr/local/nginx
1.在nginx上创建一个”vhost”目录。
2.创建创建siteA的配置文件: vi /usr/local/nginx/vhost/vhost_siteA.conf 。 写入以下信息
server {
listen 80; # 监听端口
server_name www.siteA.com siteA.com; # 站点域名
root /home/user/www/blog; # 站点根目录
index index.html index.htm index.php; # 默认导航页
location / {
# WordPress固定链接URL重写
if (!-e $request_filename) {
rewrite (.*) /index.php;
}
}
# PHP配置
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}}
3.创建创建siteB的配置文件: vi /usr/local/nginx/vhost/vhost_siteB.conf 。
写入的信息与siteA相同,只是将siteA替换为siteB。
4.打开nginx.conf文件, 打开nginx.conf文件
http {
include /usr/local/nginx/vhost/*.conf;}
第三步:重启服务 : nginx restart
第四步: 分别访问两个域名,对应的站点都可以打开。
三、限制IP相关配置1、禁止使用IP访问
为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网,以及其他的恶意操作。可以设置禁止IP访问。
server { # 配置禁止使用IP访问站点
listen 80 default;# 使用default,表示本机,必须定义
server_name _; # 使用下划线,表示本机,必须定义
return 500; # return 500,表示返回响应值。
#也可以这样写,将使用IP访问的重定向到另一个站点 rewrite ^(.*) http://www.exchangecn.com permanent;} server { # 主站点配置
listen 80;
server_name www.zx1989.top zx1989.top;# 禁止域名访问后,必须对其他server二配置server_name}
第一种情况:访问A站定向到B站
server {
server_name www.exchangecn.net ;
rewrite ^(.*) http://www.exchangecn.com $1 permanent; }
第二种情况:不是访问A站的全部重定向到指定页面
server {
server_name www.exchangecn.net;
if ($host != 'exchangecn .net' ) {
rewrite ^/(.*)$ http://www.exchangecn.com/$1 permanent;
} }
2、限制IP访问次数
如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。 cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。 HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。 HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令 这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制