Skip to content

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;
    }
}

正在精进