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;
}
}
- 命中只管请求路径部分,不管参数url参数部分。
- 首先根据location的规则依次去匹配(“/”将放到最后匹配),如果有location命中则停止匹配,否则命中“/”;
server_name
可以由精确的字符串、通配符、正则表达式进行指定。如果一个请求被多个server_name匹配,优先级为:
- 精确匹配
- 以
*
开头的最长通配符 ,eg: *.baidu.com - 以
*
结尾的最长通配符 ,eg: www.baidu.* - 第一个命中的正则表达式
通配符命名限制
通配符形式只能在名称的前面或者后面,且只能出现在一个点边的边界上,比如: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会在一段时间内尽量少的将请求分发给该服务。
负载均衡的方法
- 轮询(默认方法):循环分发请求。
- 最少连接:下一个请求将交给持有最少活动连接的工作线程。
- 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
指令设置。
所以,一般情况下代理服务器通过定时发送心跳数据来保持链接。