Nginx 常用功能

980 阅读3分钟

Nginx 跨域配置

http {
    #允许跨域请求的域,*代表所有
    add_header 'Access-Control-Allow-Origin' *;
    #允许带上cookie请求
    add_header 'Access-Control-Allow-Credentials' 'true'; 
    #允许请求的方法,比如 GET/POST/PUT/DELETE
    add_header 'Access-Control-Allow-Methods' *;
    #允许请求的header
    add_header 'Access-Control-Allow-Headers' *;
}

Nginx 防盗链配置

http {
    #对源站点验证 
    valid_referers baidu.com; 
    #非法引入会进入下方判断
    if ($invalid_referer) {
        return 404
    }

Nginx 负载均衡

upstream tomcats {
	server 119.3.214.158:6991;
	server 119.3.214.158:6992;
	server 119.3.214.158:6993;
}
server {
	listen 6990;
	location / {
		proxy_pass  http://tomcats;
	}
}

upstream 参数

weight=number

设置server的权重,默认是1

upstream tomcats { 
    server 192.168.1.173:8080 weight=1; 
    server 192.168.1.174:8080 weight=3; 
    server 192.168.1.175:8080 weight=5; 
}

max_conns=number

限制每台server的连接数,用于保护避免过载,可起到限流作用。

upstream tomcats { 
    server 192.168.1.173:8080 max_conns=2; 
    server 192.168.1.174:8080 max_conns=2; 
    server 192.168.1.175:8080 max_conns=2; 
}

slow_start=time

多长时间内缓慢启动(仅限商业版可用)

upstream tomcats { 
    server 192.168.1.173:8080 weight=1; 
    server 192.168.1.174:8080 weight=3;
    # 60s秒内 权重从 0 --> 5, server由不可用变为可用
    server 192.168.1.175:8080 weight=5 slow_start=60s; 
}

down

将server标记为不可用

backup

将server标记为备份服务器。 当主服务器不可用时,它将启用。

fail_timeout=time

表示失败的重试时间

max_fails=number

表示失败几次,则标记server已宕机,剔出上游服务 假设目前设置如下:

max_fails=2 fail_timeout=15s

则代表在15秒内请求某一server失败达到2次后,则认为该server已经挂了或者宕机了,随后再过15秒,这15秒内不会有新的请求到达刚刚挂掉的节点上,而是会请求到运作的server,15秒后会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复

keepalive connections

如果你在上游服务器upstream中配置支持 keepalive,Nginx 现在将重用现有的 TCP 连接而不创建新的连接。这可以大大减少TIME_WAIT繁忙的 SSL 服务器上的TCP 连接数

upstream http_backend {
    server 127.0.0.1:8080;
    
    # 保持TCP连接的数量, 方便后续重用
    keepalive 16;
}

server {
    location /http/ {
        proxy_pass http://http_backend;
        
        # 默认是 HTTP/1, keepalive 只有在 HTTP/1.1才可以使用
        proxy_http_version 1.1;
        # 如果客户端发送了这个请求头 清除它
        # 因为该值 可能为 [keepalive | close], 如果是close表明客户端或服务器想要关闭该网络连接,这是HTTP/1.0请求的默认值
        proxy_set_header Connection "";
        ...
    }
}

负载均衡策略

round-robin 轮询

对应用服务器的请求以循环方式分发

加权轮询

通过给server分配权重,影响负载均衡

upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
    }

使用此配置,每 5 个新请求将按如下方式分布在应用程序实例中:3 个请求将被定向到 srv1,一个请求将被定向到 srv2,另一个请求将被定向到 srv3

least-connected 最少连接

下一个请求被分配给活动连接数最少的服务器

    upstream myapp1 {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

ip-hash

通过一个散列函数确定应该为下一个请求选择哪个服务器(基于客户端的 IP 地址)

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

但是ip-hash存在一些问题:

  1. 服务器增加或减少导致必须重新计算哈希(使用新数量的服务器),现有ip的后续请求会发送到其它机器上,最终导致缓存或session失效
  2. 倾斜,即太多的ip会散列到一个服务器而而导致分布不均匀 而一致性hash能很好的解决上述问题

image.png

Nginx 配置HTTPS域名证书

  1. 安装SSL模块

    要在nginx中配置https,就必须安装ssl模块,也就是: http_ssl_modul

  2. 配置HTTPS

    • 把ssl证书 *.crt 和 私钥 *.key 拷贝到 /usr/local/nginx/conf 目录中
    • 新增 server 监听 443 端口
    server {
        listen  443;
        # 你的域名 
        server_name dsying.cn; 
        # 开启ssl
        ssl on;
    
        # 配置ssl证书
        ssl_certificate dsying.cn.crt;
        # 配置ssl秘钥
        ssl_certificate_key dsying.cn.key;
    
        # ssl会话cache
        ssl_session_cache shared:SSL:1m;
        # ssl会话超时时间
        ssl_session_timeout 5m;
    
    
        location / { 
            proxy_pass http://公网地址:项目端口号;
        }
    }