Nginx
反向代理:屏蔽背后具体的服务的代理方式
- 提供一个域名,代理到对应的服务,可以随时扩缩容 Nginx:具备一定的网关能力,所有流量都会经过
- 具备一些通用网关能力
- 日志
- 限流
- 输入输出修改
- 封禁
- 压缩
- 自定功能
- 负载均衡
- 支持多协议:
- websocket
- http
- tcp/udp
- 单线程避免并发问题
- 多个 worker 进程同时处理(同时监听同一个 ip:port ),操作系统随机分配给一个进行处理(为什么不会端口冲突)
- 通过多个 worker 共享内存实现共用同一份数据保证计数等场景符合要求
- master 进程:协调进程,负责读取 nginx.conf 配置,统一管理多个 worker 的功能更新(滚动升级)
- proxy cache:将部分请求的响应存储到磁盘中,减少响应时间和网络负载
- nginx 基于事件模型,当把请求转发给服务器后,会注册一个事件,如果服务器响应到达就会去处理这个事件。(使用 epoll 的方式)
- 会采用动静分离的模式:
- 对于 css、html 等,直接放在 nginx 中,不需要转发后台服务期
- 实际请求是动态资源,由服务器处理
配置
- 配置文件:对于 linux,放在
/etc/nginx下面,一般通过 docker 启动的话,就可以自己指定配置文件路径了- 主配置文件:nginx.conf
- 次配置文件:conf.d下面
- 一般每个域名,放在 conf.d 下面的一个文件中,文件名用域名,更加方便管理
conf
server {
listen 80;
listen [::]:80;
server_name www.camellia.ac.cn;
return 301 https://$host$request_uri;
}
# HTTPS configuration
server {
listen 443 ssl http2;
server_name www.camellia.ac.cn;
# SSL certificates
ssl_certificate /data/nginx/certs/fullchain.pem;
ssl_certificate_key /data/nginx/certs/camellia.ac.cn.key;
# Main application - 处理所有常规请求
location / {
proxy_pass http://127.0.0.1:6666;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 升级头
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# WebSocket for notifications - 处理 WebSocket 连接
location /notifications/hub {
proxy_pass http://127.0.0.1:3012;
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;
proxy_set_header X-Forwarded-Proto $scheme;
}
# WebSocket 协商端点 - 必须代理到 HTTP 端口
location /notifications/hub/negotiate {
proxy_pass http://127.0.0.1:6666;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}