引言:认识Nginx
想象一下,当你访问淘宝抢购限量商品,或在百度搜索信息时,背后都有一位高效的"技术管家"在默默工作------它就是 Nginx。这个发音为"engine x"的软件,既是高性能的 Web 服务器,又是聪明的反向代理和负载均衡专家,就像餐厅里那位既能直接服务客人(处理静态资源),又能巧妙引导客流的前台总管12。
为什么是 Nginx?
Nginx 诞生于 2004 年,由俄罗斯程序员 Igor Sysoev 开发,最初是为解决"** C10K 问题 "------即如何让服务器同时处理数万个并发连接23. 它采用 异步非阻塞的事件驱动模型**,就像一位训练有素的前台接待员,能同时应对多位客人的需求,而不是为每个客人单独安排一个服务员。这种设计让 Nginx 实现了"** 用最少资源办最多事 **"的奇迹:单台 4 核 8G 服务器可稳定处理超过 5 万并发连接,10000 个空闲连接仅占用 2.5MB 内存456。
Nginx 核心优势速览
- 高性能:基于异步非阻塞模型,理论并发量达 10 万+
- 低消耗:几 MB 内存即可稳定运行
- 零宕机 :支持热部署(
nginx -s reload
) - 全功能:静态服务、反向代理、负载均衡等一站式解决
通俗理解核心概念
反向代理 :就像公司前台,客户只需对接前台(Nginx),由前台将请求转发给后端不同部门。比如你访问淘宝首页时,Nginx 会自动将静态图片请求转发给图片服务器,动态数据请求转发给业务服务器17。
负载均衡 :类似餐厅高峰期的客流分配。当大量用户同时访问时,Nginx 会像经验丰富的经理,将请求均匀分配给多台后端服务器,避免某台服务器因压力过大"罢工"68。
安装指南:Windows与Linux双平台部署
Windows 平台部署步骤
1. 下载 Nginx 安装包
访问 Nginx 官方网站(http://nginx.org)获取Stable version(稳定版本) ,若需特定旧版本,可从搜狐镜像站(http://mirrors.sohu.com/nginx/)下载11112。
2. 解压与路径选择
将压缩包解压至无中文、无空格的路径 (例如 C:\nginx-1.24.0
)。
注意:解压路径若包含中文或空格,可能导致服务启动失败。
3. 启动 Nginx 服务
命令行启动(推荐):
-
按下
Win + R
,输入cmd
打开命令提示符 -
执行以下命令: bash
cd C:\nginx-1.24.0 start nginx
4. 端口占用排查
若启动失败,大概率是 80 端口被占用:
-
查看端口占用: bash
netstat -ano | findstr :80
-
找到占用进程的 PID,在任务管理器中结束对应进程后重新启动。
5. 验证安装结果
打开浏览器访问 http://localhost
,若看到 "Welcome to nginx!" 页面,说明安装成功。
Linux 平台部署步骤(以 CentOS 为例)
1. 配置官方仓库(避免旧版本)
bash
# 安装必要工具
sudo yum install -y curl policycoreutils openssh-server
# 添加官方源文件
sudo tee /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
2. 导入 GPG 密钥验证
bash
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /etc/pki/rpm-gpg/RPM-GPG-KEY-nginx
3. 安装与启动服务
bash
sudo yum install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx # 设置开机自启
4. 验证安装结果
执行 sudo systemctl status nginx
,若显示 "active (running)",访问服务器 IP 查看默认页面。
基础配置解析:nginx.conf核心指令
Nginx 的配置文件 nginx.conf
就像一栋精心设计的房屋,每个区块都有明确的功能分工:
- 全局块 = 地基:决定整体性能(如进程数量)
- events块 = 门窗:控制连接处理能力
- http块 = 主体:包含所有网站配置
- server块 = 房间:对应单个网站的独立配置
一、核心配置示例(含注释)
nginx
# 全局块:地基级配置
worker_processes auto; # 自动匹配CPU核心数
# events块:门窗级配置
events {
worker_connections 1024; # 每个worker进程的最大连接数
}
# http块:主体级配置
http {
include mime.types; # 引入文件类型定义
default_type application/octet-stream;
sendfile on; # 启用高效传输模式
# server块:房间级配置(单个网站)
server {
listen 80; # 监听端口
server_name localhost; # 网站域名
location / { # 匹配所有URL
root /var/www/html; # 静态资源存放目录
index index.html index.htm; # 默认首页文件
}
}
}
二、关键指令解析
- worker_processes :进程数量,设为
auto
可自动匹配 CPU 核心数1314。 - worker_connections :单个进程最大连接数,默认 1024,可根据服务器配置调整13。
- root :静态资源根目录,示例中
/var/www/html
表示文件实际路径1516。
三、配置验证
修改配置后必须验证语法:
bash
nginx -t # 测试配置文件语法
nginx -s reload # 重新加载配置(无需重启服务)
核心功能实战
静态资源服务
配置示例(个人博客场景)
nginx
server {
listen 80;
server_name blog.example.com;
# 开启gzip压缩
gzip on;
gzip_types text/plain text/css application/javascript image/jpeg image/png;
location / {
root /var/www/blog; # 博客文件存放目录
index index.html;
}
# 图片缓存15天
location ~* \.(jpg|jpeg|png|gif)$ {
expires 15d;
add_header Cache-Control "public, max-age=1296000";
}
# JS/CSS缓存1天
location ~* \.(js|css)$ {
expires 1d;
add_header Cache-Control "public, max-age=86400";
}
}
实战步骤
-
准备博客文件:
bash
mkdir -p /var/www/blog echo "<h1>我的个人博客</h1><link rel='stylesheet' href='style.css'>" > /var/www/blog/index.html echo "body { background: #f5f5f5; }" > /var/www/blog/style.css
-
验证缓存效果:
bash
curl -I http://blog.example.com/style.css # 应返回 Cache-Control: public, max-age=86400
反向代理配置
配置示例(转发到本地8080端口服务)
nginx
server {
listen 80;
server_name localhost;
location /api/ {
proxy_pass http://127.0.0.1:8080/; # 转发目标地址
proxy_set_header Host $host; # 传递客户端请求的域名
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
}
}
配置关键点
proxy_pass
结尾的/
决定路径拼接规则:若目标地址带/
,则location /api/
中的/api
会被替换为/
- 例如
/api/users
会转发到http://127.0.0.1:8080/users
负载均衡策略
三种核心策略对比
策略类型 | 特点 | 适用场景 |
---|---|---|
轮询(默认) | 按顺序分发请求 | 后端服务器配置相同 |
权重(weight) | 可设置服务器权重 | 服务器配置不同 |
IP哈希(ip_hash) | 同一客户端始终访问同一服务器 | 有状态服务(如登录会话) |
配置示例(权重策略)
nginx
http {
upstream myapp {
server 192.168.1.100:80 weight=3; # 权重3
server 192.168.1.101:80 weight=2; # 权重2
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://myapp;
proxy_set_header Host $host;
}
}
}
验证负载效果
多次执行 curl http://app.example.com
,查看后端服务器日志,权重3的服务器应收到约60%的请求。
常用命令与运维操作
命令速查表
命令 | 作用 | 适用系统 |
---|---|---|
nginx -t |
验证配置语法 | 全平台 |
nginx -s reload |
热重载配置 | 全平台 |
nginx -s quit |
优雅停止服务 | 全平台 |
sudo systemctl start nginx |
启动服务 | Linux |
start nginx |
启动服务 | Windows |
taskkill /f /t /im nginx.exe |
强制停止所有进程 | Windows |
Windows服务注册
bash
# 安装为Windows服务(需管理员权限)
sc create nginx binPath= "C:\nginx-1.24.0\nginx.exe" start= auto
# 启动服务
sc start nginx
# 停止服务
sc stop nginx
# 删除服务(如需卸载)
sc delete nginx
关键注意事项
- 热重载配置 :修改配置后务必执行
nginx -t && nginx -s reload
- 优雅停止 :生产环境优先使用
nginx -s quit
,避免丢失请求 - 路径问题 :Windows系统中配置文件路径需使用反斜杠
C:\\nginx
常见问题排查与解决
80端口被占用
错误 :bind() to 0.0.0.0:80 failed (98: Address already in use)
解决:
bash
# Linux查找并终止占用进程
sudo fuser -k 80/tcp
# Windows查找占用进程
netstat -ano | findstr :80
# 根据PID结束进程
taskkill /pid 1234 /f
配置文件修改后不生效
排查步骤:
- 验证配置语法:
nginx -t
- 检查是否重新加载:
nginx -s reload
- 确认配置文件路径是否正确(默认
/etc/nginx/nginx.conf
)
中文乱码问题
解决 :在 http
块添加字符集声明
nginx
http {
charset utf-8;
}
错误日志查看
配置错误日志路径:
nginx
http {
error_log /var/log/nginx/error.log; # Linux路径
# Windows路径示例:error_log logs/error.log;
}
通过 tail -f /var/log/nginx/error.log
实时查看错误信息。
进阶学习路径
初级:HTTPS免费证书配置
使用Let's Encrypt自动配置:
bash
certbot --nginx -d yourdomain.com
自动修改Nginx配置并配置证书自动续签21。
中级:缓存策略优化
nginx
# 浏览器缓存配置
location ~* \.(jpg|jpeg|png)$ {
expires 30d; # 图片缓存30天
}
# Gzip压缩配置
gzip on;
gzip_comp_level 5; # 压缩级别1-9,5为平衡点
高级:Lua脚本扩展
通过OpenResty实现接口限流:
nginx
location /api/ {
access_by_lua_block {
local limit = require "resty.limit.count"
local lim, err = limit.new("my_limit", 10, 60) # 60秒内允许10次请求
-- 限流逻辑...
}
proxy_pass http://backend;
}
官方学习资源: