Nginx处理请求规则
- 当Nginx在某个端口收到一个HTTP请求时,会交给监听该端口的server处理。
- 如果监听该端口的server有多个,则取决于请求头的Host与哪个server的域名(server_name)匹配。
- 如果没有匹配的域名,或者请求头的Host是IP地址,则交给监听该端口的默认server处理。
- 选用了server之后,Nginx会寻找与HTTP请求的URL匹配的location,决定如何做出响应。
静态资源
server {
listen 80; #更改为网站监听端口
server_name localhost; #更改为域名名称
location / {
root /home/web/test; # 指定静态网站根目录
index index.html; # 指定默认访问的文件
# Nginx 支持 rewrite 功能:
# 访问网址链接时自动追加 .html 后缀(这样,访问网址时就可以不用 .html 后缀)
if (!-e $request_filename){
rewrite ^(.*)$ /$1.html last;
break;
}
}
}
反向代理
server {
listen 80; #更改为网站监听端口
server_name localhost; #更改为域名名称
location / {
proxy_pass http://localhost:5000; #转发请求到本地5000端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Https
server {
#SSL 访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name www.test.com test.com;
#证书文件名称
ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem;
#私钥文件名称
ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Http自动转换为Https
方式1
server {
listen 80;
server_name www.test.com test.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
方式2
server {
listen 80;
server_name www.test.com test.com;
return 301 https://www.test.com;
}
多个网站公用一个端口
定义多个server监听同一个端口(server_name配置的域名信息不同即可)
#站点1
server {
#SSL 访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name www.site1.cn site1.cn;
#证书文件名称
ssl_certificate /Web/SSL/site1.cn_bundle.crt;
#私钥文件名称
ssl_certificate_key /Web/SSL/site1.cn.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#站点2
server {
#SSL 访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name www.site2.com site2.com;
#证书文件名称
ssl_certificate /etc/letsencrypt/live/site2.com/fullchain.pem;
#私钥文件名称
ssl_certificate_key /etc/letsencrypt/live/site2.com/privkey.pem;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /Web/test;
index index.html;
}
}
无匹配server处理
添加默认server 用于当没有找到请求相匹配的server时 返回一个Nginx的404页面
#http没有匹配到server_name返回404
server {
listen 80 default_server;
#隐藏nginx版本号
server_tokens off;
server_name _;
return 404;
}
#https没有匹配到server_name返回404
server {
listen 443 ssl http2 default_server;
server_name _;
#隐藏nginx版本号
server_tokens off;
#证书文件名称
ssl_certificate /SSL/cert.cer;
#私钥文件名称
ssl_certificate_key /SSL/cert.key;
return 404;
}
多配置文件
当我们有多个域名的时候可以将配置文件进行拆分
- 将所有配置文件放到nginx目录下的conf.d目录中
- 然后在nginx.conf中加载所有配置文件(http{}中配置)
# 加载目录下所有配置文件(多域名拆分配置文件)
include /etc/nginx/conf.d/*.conf;
主配置文件用于加载所有conf.d下的配置文件 以及一些公用配置
各个子配置文件存放各自域名对应的server监听节点即可
评论区