Nginx 简介

Nginx是一个工作在第七层(应用层)的 高性能的 HTTP 服务器和反向代理服务器,同时也可以作为邮件代理服务器和通用的 TCP/UDP 代理服务器。简单说,Nginx 就是一个能把网页快速发给用户的软件,同时也能把请求转给其他服务器处理。

核心特点

特点 说明
🚀 高并发 采用异步非阻塞事件驱动架构,单机可处理数十万并发连接
💾 低内存 处理大量请求时内存占用极低(几 MB 即可运行)
🔧 热部署 可在不中断服务的情况下升级程序或重载配置
📦 模块化 核心功能精简,扩展功能通过模块按需加载
🔒 高可靠 稳定性极高,可 7×24 小时不间断运行

主要应用场景

场景 说明
静态资源服务器 托管 HTML、CSS、JS、图片等静态文件
反向代理 将客户端请求转发到后端应用服务器(如 Tomcat、Node.js、Gunicorn)
负载均衡 将流量分发到多个后端服务器
API 网关 请求路由、认证鉴权、限流熔断
SSL 终结 集中处理 HTTPS 证书,减轻后端压力
缓存服务器 缓存后端响应,加速访问

场景详解

  • 📁 静态资源服务器

    server {
        listen 80;
        location /api/ {
            proxy_pass http://localhost:3000;
        }
    }
    
  • 🔄 反向代理

    server {
        listen 80;
        location /api/ {
            proxy_pass http://localhost:3000;
        }
    }
    
  • ⚖️ 负载均衡

    upstream backend {
        server 192.168.1.10:5000 weight=3;
        server 192.168.1.11:5000 weight=1;
    }
    
  • 🔀 解决跨域
    通过将前后端置于同一域名下,避免浏览器跨域限制。

常用管理命令

所有命令都需要在 nginx.exe 文件目录中执行:

用途 命令 (在nginx目录下执行) 说明
启动 start nginx 推荐使用此命令启动
快速停止 nginx -s stop 立即停止服务
优雅停止 nginx -s quit 处理完当前访问后再停止
重载配置 nginx -s reload 修改配置后使用,无需重启
检查配置 nginx -t 检查配置文件语法是否有误
查看进程 tasklist /fi “imagename eq nginx.exe” 查看Nginx是否在运行

下载与安装

在 Windows 上安装 Nginx。

第一步:下载

  1. 打开 Nginx 官方下载页面:https://nginx.org/en/download.html
  2. 在 Stable version(稳定版)区域,点击适用于 Windows 的压缩包,例如 nginx/Windows-x.xx.x 。文件是一个 .zip 格式的压缩包

第二步:安装(解压)

  1. 将下载好的 .zip 文件解压。
    关键点:将解压后得到的 nginx-1.xx.x 文件夹,整个移动到没有中文且没有空格的纯英文路径下,例如 D:\demo\nginx 。这是为了避免程序运行时发生未知错误。

第三步:启动与验证

  1. 在 Nginx 目录的地址栏里(D:\demo\nginx),输入 cmd 并回车,即可在此处打开命令提示符。
  2. 输入 start nginx 并回车。

验证是否成功:
打开浏览器,在地址栏输入 http://localhost 或 http://127.0.0.1。
如果页面显示 “Welcome to nginx!”,就说明安装启动成功啦!

实战案例:Python + Nginx 实现反向代理与负载均衡

案例架构图:

浏览器 ──→ Nginx:80 ──┬──→ 静态文件 (HTML/CSS/JS)
                      ├──→ Python 服务1:5000 (API服务器)
                      └──→ Python 服务2:5001 (备份服务器)

🚀 第一步:准备 Python 后端服务

创建两个 Python 文件来模拟不同的后端服务:

  • app1.py - 主服务器(端口5000)

    from flask import Flask, jsonify, request
    import time
    
    app = Flask(__name__)
    
    @app.route('/api/user')
    def get_user():
        return jsonify({
            'server': '主服务器:5000',
            'user': {'id': 1, 'name': '张三'},
            'time': time.time()
        })
    
    @app.route('/api/hello')
    def hello():
        return jsonify({'message': 'Hello from 主服务器:5000'})
    
    if __name__ == '__main__':
        app.run(port=5000, debug=True)
    
  • app2.py - 备用服务器(端口5001)

    from flask import Flask, jsonify, request
    import time
    
    app = Flask(__name__)
    
    @app.route('/api/user')
    def get_user():
        return jsonify({
            'server': '备用服务器:5001',
            'user': {'id': 2, 'name': '李四'},
            'time': time.time()
        })
    
    @app.route('/api/hello')
    def hello():
        return jsonify({'message': 'Hello from 备用服务器:5001'})
    
    if __name__ == '__main__':
        app.run(port=5001, debug=True)
    
  • 启动 Python 服务
    ```bash
    # 安装 Flask(如果没有安装)
    pip install flask

      # 分别打开两个命令行窗口启动
      python app1.py  # 窗口1
      python app2.py  # 窗口2
      ```
    

📁 第二步:创建静态文件

index.html - 前端测试页面(放在 D:\demo\nginx\html\)

	<!DOCTYPE html>
	<html>
	<head>
	    <meta charset="UTF-8">
	    <title>Nginx 功能演示</title>
	    <style>
	        body { font-family: Arial; padding: 20px; }
	        button { margin: 10px; padding: 10px 20px; font-size: 16px; cursor: pointer; }
	        .result { margin: 20px; padding: 15px; border: 1px solid #ddd; background: #f9f9f9; }
	        .success { color: green; }
	        .error { color: red; }
	    </style>
	</head>
	<body>
	    <h1>Nginx 功能演示 - 跨域解决</h1>
	    
	    <div>
	        <button onclick="testApi()">测试反向代理</button>
	        <button onclick="loadBalance()">测试负载均衡(连续点击)</button>
	        <button onclick="testHello()">测试API</button>
	        <button onclick="clearResult()">清空</button>
	    </div>
	    
	    <div id="result" class="result">
	        结果将显示在这里...
	    </div>
	    
	    <script>
	        // 注意:这里请求的是 80 端口(Nginx),而不是直接请求 Python 的 5000/5001 端口
	        const API_BASE = 'http://localhost';
	        
	        async function testApi() {
	            try {
	                const response = await fetch(`${API_BASE}/api/user`);
	                const data = await response.json();
	                showResult('✅ 反向代理成功!<br>' + JSON.stringify(data, null, 2));
	            } catch(e) {
	                showResult('❌ 错误:' + e.message, true);
	            }
	        }
	        
	        async function loadBalance() {
	            try {
	                const response = await fetch(`${API_BASE}/api/user`);
	                const data = await response.json();
	                // 显示响应的服务器,证明请求被分发到了不同的服务器
	                showResult(`🔄 负载均衡演示<br>响应服务器:${data.server}<br>${JSON.stringify(data, null, 2)}`);
	            } catch(e) {
	                showResult('❌ 错误:' + e.message, true);
	            }
	        }
	        
	        async function testHello() {
	            try {
	                const response = await fetch(`${API_BASE}/api/hello`);
	                const data = await response.json();
	                showResult('✅ API 调用成功<br>' + JSON.stringify(data, null, 2));
	            } catch(e) {
	                showResult('❌ 错误:' + e.message, true);
	            }
	        }
	        
	        function showResult(msg, isError = false) {
	            const resultDiv = document.getElementById('result');
	            resultDiv.innerHTML = `<div class="${isError ? 'error' : 'success'}">${msg}</div>`;
	        }
	        
	        function clearResult() {
	            document.getElementById('result').innerHTML = '结果将显示在这里...';
	        }
	    </script>
	</body>
	</html>

⚙️ 第三步:配置 Nginx

编辑 D:\demo\nginx\conf\nginx.conf:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    
    # 负载均衡配置:定义一组后端服务器
    upstream backend_servers {
        # 负载均衡策略:轮询(默认)
        server 127.0.0.1:5000 weight=3;  # weight 权重,3表示分配3份流量
        server 127.0.0.1:5001 weight=1;  # 主服务器和备用服务器的流量比例 3:1
        
        # 其他策略示例(可以取消注释测试):
        # ip_hash;  # 同一IP固定到同一台服务器
        # least_conn;  # 最少连接数
    }
    
    server {
        listen       80;
        server_name  localhost;
        
        # 1. 静态文件服务器:直接返回 HTML/CSS/JS
        location / {
            root   html;  # 对应 C:\nginx\html 目录
            index  index.html index.htm;
        }
        
        # 2. 反向代理 + 负载均衡:将 /api/ 开头的请求代理到后端服务器组
        location /api/ {
            proxy_pass http://backend_servers;  # 转发到 upstream 定义的服务器组
            
            # 设置代理请求头,让后端能获取真实IP
            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_connect_timeout 30s;
            proxy_send_timeout 30s;
            proxy_read_timeout 30s;
        }
        
        # 3. 解决跨域的配置(可选,如果前后端分离时使用)
        # 如果前端是 http://localhost,后端在其他端口,浏览器会报跨域错误
        # 通过 Nginx 代理后,同源策略自动解决
        
        # 显示后端状态(可选)
        location /nginx_status {
            stub_status;
            allow 127.0.0.1;
            deny all;
        }
    }
}

🔧 第四步:运行验证

# 1. 确保 Python 服务已启动(两个窗口)
# 窗口1: python app1.py
# 窗口2: python app2.py

# 2. 进入 Nginx 目录测试配置
nginx -t  # 检查配置是否正确

# 3. 启动或重载 Nginx
start nginx      # 如果未启动
# 或
nginx -s reload  # 如果已启动

# 4. 打开浏览器访问
http://localhost

🎯 演示效果说明
在这里插入图片描述

  1. HTTP 静态服务器
    • 访问 http://localhost 会自动返回 html/index.html
    • Nginx 直接返回静态文件,不经过 Python
  2. 反向代理
    • 点击"测试反向代理"按钮
    • 前端请求 http://localhost/api/user
    • Nginx 接收请求,转发给后端的 Python 服务
    • 前端不知道后端的具体地址(隐藏了5000端口)
  3. 负载均衡
    • 连续点击"测试负载均衡"按钮
    • 观察返回结果中 server 字段的变化
    • 应该能看到请求在主服务器(5000)和备用服务器(5001)之间分配
    • 权重比例是 3:1,主服务器出现的概率更高
  4. 解决跨域
    • 通常前端在 80 端口,后端在 5000 端口,浏览器会阻止跨域请求
    • 通过 Nginx 代理后,前后端都在同一个域名端口(localhost:80)下
    • 跨域问题自然解决,无需配置 CORS

总结

Nginx 凭借其高性能、低资源消耗、稳定性强的特点,已成为互联网基础设施的核心组成部分。从静态托管到负载均衡,从跨域解决到网关代理,从单机部署到 K8s 集群,它是每个开发者都应该掌握的高性能神器。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐