Nginx学习与应用

文章目录

Nginx 简介

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

核心特点

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

主要应用场景

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

场景详解

  • 📁 静态资源服务器

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

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

    nginx 复制代码
    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://localhosthttp://127.0.0.1

如果页面显示 "Welcome to nginx!",就说明安装启动成功啦!

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

案例架构图:

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

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

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

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

    python 复制代码
    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)

    python 复制代码
    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\)

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:

nginx 复制代码
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;
        }
    }
}

🔧 第四步:运行验证

bash 复制代码
# 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 集群,它是每个开发者都应该掌握的高性能神器。

相关推荐
乘云数字DATABUFF14 小时前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--3 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森3 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜3 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB4 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode6 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220706 天前
如何搭建本地yum源(上)
运维
ping某7 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树889 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠9 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql