Skip to content

nginx

约 2970 字大约 10 分钟

计算机技术

2025-04-04

nginx

安装Nginx

docker安装

docker run -d --restart=always \
--net host \
--name nginx \
-v ./nginx.conf:/etc/nginx/nginx.conf \
-v ./log:/var/log/nginx \ # log
-v ./cert:/etc/nginx/cert \ # SSL证书文件, 没有可以去掉
-v ./html:/usr/share/nginx/html \
nginx:1.24.0

​ net=host是因为懒得配端口了, 这样好一些

​ shell启动不够优雅, 建议使用docker compose

version: '3.8'
services:
  nginx:
    image: nginx:1.24.0
    container_name: nginx
    restart: always
    network_mode: host
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./logs:/var/log/nginx:rw
      - ./cert:/etc/nginx/cert:ro
      - ./html:/usr/share/nginx/html:ro # 一些html或者error.json

​ 注意:

  1. network_mode是linux专用, docker desktop没用
  2. host网络模式不是最佳实践, 如果有确定的后端编排还是一起编排比较合适

apt下载安装启动(不建议)

为了不找不自在, 还是用docker部署吧!

​ 不建议使用apt安装, 因为会缺少很多模块, 而且版本较老

sudo apt install nginx
service nginx start # 启动nginx

​ 然后打开80端口查看情况, 如果出现nginx主页说明成功

从源码编译安装并配置SSL模块

参考: https://developer.aliyun.com/article/766958

​ 先安装好nginx

  1. 去官网下载源码: https://nginx.org/en/download.html

建议下载Stable version

  1. 解压安装包
tar -zxvf <包的名字>
  1. 安装SSL模块

到nginx目录下, 输入

./configure --prefix=/etc/nginx --with-http_ssl_module

/ect/nginx是你的nginx安装位置, 也可以是/usr/local/nginx

如果用apt安装的话, 为/etc/nginx

如果出现 the HTTP rewrite module requires the PCRE library, 则安装:

apt-get install libpcre3 libpcre3-dev

​ 上面的命令是配置ssl模块

  1. 用make命令编译, 注意不要使用make install, 会重新安装nginx, 当然, 想重新安装也可以输入
make

这里面可能会出现errors, 不用管

如果出现了缺少包依赖的错误, 直接安装即可, 这里提供一些可能出现的:

sudo apt-get install libpcre3 libpcre3-dev # 缺少pcre
sudo apt-get install openssl libssl-dev # 缺少openssl
sudo apt-get install zlib1g-dev # 缺少zlib
  1. 将obj的文件复制到nginx上覆盖原来的文件

  2. 查看是否安装成功

nginx -V

如果出现**--with-http_ssl_module**则成功

nginx文件树

nginx配置文件在/etc/nginx中

nginx启动时加载nginx.conf

其中有两行:

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

意思是引用了这两个目录下的所有文件

其中, sites-enabled 是 sites-available的链接, 把想启动的配置放在这里即可, 同理当想临时关闭某个站点时, 把sites-enabled对应的链接删去即可

当然,也可以在conf.d中放配置文件, 不过不建议

注意: 由于 sites-enabled 有默认的nginx界面,所有访问均会导向默认界面 所以要使我们的配置生效, 需要把sites-enabled的链接删去

nginx架构

nginx 一把梭!(超详细讲解+实操)

配置模板开箱即用

​ 注意, 需要使用上面的docker-compose.yaml启动, 目录下放这个配置文件(nginx.conf)

配置示例

修改错误返回值

​ 有些时候希望返回的不是service unavailable, 希望返回某段json, 可以这样设置

​ /50x.json是返回的json内容, 也可以返回其他网页

server {
    ...
    error_page 5xx /5xx.json;
    location = /5xx.json {
        root /usr/share/nginx/html;
        internal; # 保证这个路径只能内部请求
    }
    ...
}

websocket配置

​ websocket比较特殊, 需要加入upgrade和connection

location /api/ws/ {
    proxy_redirect off;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass       http://127.0.0.1:9000/api/ws/;
}

SSE配置

​ SSE配置需要去掉缓存, 不然SSE失效

location /api/sse {
    proxy_redirect off;
    proxy_pass         http://127.0.0.1:9000/api/sse;
    proxy_buffering off; # 去掉缓存
}

请求速率限流

http{
    ...
    # 对请求速率限流
    limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=5r/s;
    
    server{
        location /api {
            ...
            limit_req zone=myRateLimit burst=5 nodelay;
            limit_req_status 520; # 返回码
            limit_req_log_level info;
        }
    }
}
  • $binary_remote_addr: 基于客户端IP做限流

    zone=myRateLimit:10m 指myRateLimit作为内存区域, 大小10M(16万)IP地址

    rate=5r/s 指相同IP每秒最多请求5次(200ms一个请求)

  • burst=5: 削峰, 如果峰值超过rate(比如说200ms来了两个), 则会用一个大小为burst的队列削峰, 然后慢慢根据rate速率处理, 多余的直接503

  • nodelay: 如果是nodelay, 则burst削峰会立即处理, 而不是每200ms取一个

    nodelay立即处理, 那么nginx怎么控制并发? 是通过处理但不释放的方式控制. 后面的请求会阻塞

    一般建议burst和nodelay一起用, 可以处理突发流量

请求连接数限流

http{
    # 针对ip  对请求连接数限流
    ...
    limit_conn_zone $binary_remote_addr zone=myConnLimit:10m; 
    ...
    
    server{
       ...
       limit_conn myConnLimit 12;
    }
}

https/SSL

​ 注意需要http_ssl_module

ssl_certificate: .pem或者/csr文件

ssl_certificate_key: 一般是.key文件

80重定向到443

server_name www.hzznb-xzll.xyz hzznb-xzll.xyz;
# 重定向到目标地址
return 301 https://$server_name$request_uri;

压缩

负载均衡

配置热备

upstream mysvr { 
    server 192.168.10.121:3333 max_fails=2 fail_timeout=2;
    server 192.168.10.122:3333 backup;
}
  • max_fails: 允许请求失败的最大次数, 超过时返回proxy_next_upstream模块定义的错误
  • fail_timeout: 经历了max_fails失败后暂停服务的时间

轮询(round-robin)

upstream mysvr { 
    server 127.0.0.1:7878;
    server 192.168.10.121:3333;       
}
  • 请求会分别发送到两个服务器, A-B-A-B......
upstream mysvr { 
    server 127.0.0.1:7878 weight=1;
    server 192.168.10.121:3333 weight=2;
}
  • 给不同服务器设置权重, 上面会变成A-B-B-A-B-B......

ip_hash

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333;
    ip_hash;
}
  • 会让相同客户端请求相同的服务器, 实现session等的共享