Tomato's Blog

Back

Nginx 介绍#

Nginx 是一款高性能的开源 Web 服务器,同时支持反向代理、负载均衡、HTTP 缓存等功能。

  • 核心优势
    • 高并发处理:基于事件驱动的异步架构,可轻松支持数万并发连接。
    • 低内存消耗:高效的内存管理机制。
    • 模块化设计:通过模块扩展功能(如 HTTP/2、gzip 压缩等)。
  • 应用场景:静态资源托管、反向代理、API 网关、负载均衡。

Web 服务器基础#

静态资源托管#

server {
    listen 80;
    server_name example.com;
    root /var/www/html;  # 静态文件根目录
    
    location / {
        index index.html;
    }
}
nginx
  • 关键指令
    • listen:监听端口。
    • server_name:域名。
    • root:静态资源存放路径。

配置示例#

# 安装 Nginx(Ubuntu)
sudo apt update && sudo apt install nginx

# 启动服务
sudo systemctl start nginx
sudo systemctl enable nginx
bash

Location 指令#

语法规则#

location [匹配模式] URI {
    # 配置逻辑
}
nginx
  • 匹配模式
    • =:精确匹配(location = /api)。
    • ^~:前缀匹配(优先级高于正则)。
    • ~:正则匹配(区分大小写)。
    • ~*:正则匹配(不区分大小写)。

优先级顺序#

精确匹配(=) → 前缀匹配(^~) → 正则匹配(~或~*) → 通用匹配(/)
plaintext

反向代理#

基本配置#

将请求转发到后端应用服务器(如 Node.js、Java):

server {
    listen 80;
    server_name api.example.com;
    
    location / {
        proxy_pass http://localhost:3000;  # 后端服务地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
nginx

常用指令#

  • proxy_pass:定义后端服务地址。
  • proxy_set_header:传递客户端请求头。

负载均衡#

配置策略#

http {
    upstream backend {
        server 192.168.1.101:8080 weight=3;  # 权重轮询
        server 192.168.1.102:8080;
        server 192.168.1.103:8080 backup;    # 备用服务器
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
    }
}
nginx
  • 负载均衡算法
    • 轮询(默认):均匀分配请求。
    • 权重(weight):指定服务器优先级。
    • IP Hash:根据客户端 IP 分配固定服务器。

技术概要与配置说明#

核心技术#

  • 事件驱动模型:非阻塞 I/O,高效处理并发。
  • Master/Worker 架构:Master 管理配置,Worker 处理请求。
  • 热重载nginx -s reload 不中断服务更新配置。

常用配置片段#

# 启用 Gzip 压缩
gzip on;
gzip_types text/plain application/json;

# 日志配置
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
nginx

Web 服务器部署实战#

部署静态网站#

  • 将 HTML/CSS/JS 文件放入 /var/www/html
  • 配置 Nginx Server 块指向该目录。

域名解析#

  • 在 DNS 服务商添加 A 记录,将域名指向服务器 IP。

域名与 HTTPS 证书配置#

使用 Let’s Encrypt 免费证书#

# 安装 Certbot
sudo apt install certbot python3-certbot-nginx

# 自动申请并配置证书
sudo certbot --nginx -d example.com -d www.example.com
bash

强制 HTTPS 跳转#

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;  # 301 重定向到 HTTPS
}

server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    # 其他 HTTPS 配置...
}
nginx

Docker + Nginx + HTTPS 实战#

Docker 部署 Nginx#

# 拉取镜像
docker pull nginx:alpine

# 运行容器(挂载配置和证书)
docker run -d \
  --name my-nginx \
  -p 80:80 \
  -p 443:443 \
  -v /path/to/nginx.conf:/etc/nginx/nginx.conf \
  -v /path/to/certs:/etc/nginx/certs \
  nginx:alpine
bash

自定义 Dockerfile#

FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY certs/ /etc/nginx/certs/
EXPOSE 80 443
dockerfile

HTTPS 配置整合#

server {
    listen 443 ssl;
    server_name docker.example.com;

    ssl_certificate /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;

    location / {
        proxy_pass http://app:8080;  # 代理到其他容器
    }
}
nginx
Nginx
https://blog.itmt.io/blog/nginx-learning
Author Tomato
Published at February 2, 2025
Comment seems to stuck. Try to refresh?✨