开发中常用的Nginx配置汇总

avatar
作者
筋斗云
阅读量:9

Nginx是一个高性能的HTTP和反向代理服务器

url转发域名未备案_域名转发需要备案吗_url域名转发无需备案

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。比如下图为某个域名的解析配置

url转发域名未备案_url域名转发无需备案_域名转发需要备案吗

第二步:配置好之后,通过域名都能访问到机器的默认端口。但是机器没法知道某个域名访问的是哪个网站。这时候,你就需要使用虚拟目录了。假设你把博客放在”/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指令 这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!