nginx server命中规则

// 监听 所有ip的80端口,匹配所有的Host
server {
    listen      80;
    ...
}
// 监听 所有ip的80端口,匹配Host为 example.net或www.example.net的请求
server {
    listen      80;
    server_name example.net www.example.net;
    ...
}
// 监听 192.168.1.1的80端口,匹配所有的Host
server {
    listen      192.168.1.1:80;
    server_name example.com www.example.com;
    ...
}
// 监听所有ip的80端口,匹配Host,当请求80端口的请求没有命中别的server时作为默认server接受请求。
server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}

指定端口,默认监听所有ip,默认匹配所有Host,再没有命中Host的情况下,由 default_server接收请求,没有指定default_server的,由第一个命中的server接收请求。

Location命中规则

server {
    listen      80;
    server_name example.org www.example.org;
    root        /data/www;

    location / {
        index   index.html index.php;
    }

    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }

    location ~ \.php$ {
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME
                      $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}
  1. 命中只管请求路径部分,不管参数url参数部分。
  2. 首先根据location的规则依次去匹配(“/”将放到最后匹配),如果有location命中则停止匹配,否则命中“/”;

server_name

可以由精确的字符串、通配符、正则表达式进行指定。如果一个请求被多个server_name匹配,优先级为:

  1. 精确匹配
  2. *开头的最长通配符 ,eg: *.baidu.com
  3. *结尾的最长通配符 ,eg: www.baidu.*
  4. 第一个命中的正则表达式

通配符命名限制

通配符形式只能在名称的前面或者后面,且只能出现在一个点边的边界上,比如:www.*.baidu.com和*baidu.*是无效的,但是这两个名称可以用正则表达式表示。
“.baidu.com"可以匹配"baidu.com"和”*.baidu.com"

无效的server_name命名

“_”、“–”、"!@#"等都是无效的命名,并没有实际的作用。

配置HTTPS服务

要配置HTTPS服务器,必须在服务器块中的侦听套接字上启用ssl参数,并且应该指定服务器证书和私钥文件的位置:

server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;   # 公钥,将被发送到所有连接的客户端
    ssl_certificate_key www.example.com.key; # 秘钥,需要保留在一个访问受限,但是nginx主线程可访问的文件夹中。
    # ssl_protocols和ssl_ciphers用于限定连接,只包含SSL/TLS的强版本和密码。这是nginx的默认配置,所以可以不用显示配置
    # ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    # ssl_ciphers         HIGH:!aNULL:!MD5;
    ...
}

Https服务优化

worker_processes auto;

http {
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;

    server {
        listen              443 ssl;
        server_name         www.example.com;
        keepalive_timeout   70;

        ssl_certificate     www.example.com.crt;
        ssl_certificate_key www.example.com.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;
        ...

负载均衡

nginx中的反向代理实现包括HTTP、HTTPS、FastCGI、uwsgi、SCGI、memcached和gRPC的负载均衡。负载均衡有健康检测功能,当nginx检测到集群的服务响应失败或返回错误时,nginx会在一段时间内尽量少的将请求分发给该服务。

负载均衡的方法

  1. 轮询(默认方法):循环分发请求。
  2. 最少连接:下一个请求将交给持有最少活动连接的工作线程。
  3. ip-hash:通对客户端的ip进行hash分发请求。

注意:轮询和最少连接进行负载均衡,不能保证客户端的请求每次都发送到同一个服务器上。

负载均衡配置

http {
    upstream myapp1 {
        least_conn;
    #	ip_hash; 
	# 	round-robin  (默认方法)
        server srv1.example.com  weight=3;  # 通过加权重的方式,可以调整服务的转发
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

代理websocket服务

http {
	## 根据请求头的Upgrade设置Connection
	## 匹配请求头中有没有Upgrade字段,有则设置$connection_upgrade=upgrade,否则$connection_upgrade=close,
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        ...

        location /chat/ {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

默认设置下,代理服务器60秒内没有传输数据,将会断开链接,这个时间可以通过proxy_read_timeout指令设置。
所以,一般情况下代理服务器通过定时发送心跳数据来保持链接。