跳到主要内容

Nginx入门教程

1.Nginx 简介

Nginx 是一个高性能的 web 服务器和反向代理服务器,同时也可以用作负载均衡器、邮件代理等。特点:高并发处理能力、低资源消耗和模块化设计。

2.Nginx 与网站

Nginx 是网站与用户之间的“中间人”,负责接收用户请求,并将请求转发给网站的后端服务(比如 PHP、Node.js、Java 等应用),再把响应结果返回给用户。

大多数网站使用 Nginx 处理网站请求。

3.Nginx 学习资源

  1. 《Nginx 完全指南》 by Nginx 中文官网

  2. w3c Nginx 教程

  3. NGINX 开源社区

4.Nginx 安装部署

4.1 安装

Debian/Ubuntu:

bash
sudo apt update
sudo apt install nginx

CentOS/RHEL:

bash
sudo yum install epel-release
sudo yum install nginx

Fedora:

bash
sudo dnf install nginx

mac:

bash
brew install nginx
sudo nginx

4.2 启动

bash
sudo systemctl enable nginx
sudo systemctl start nginx

5.Nginx 配置目录

安装目录:$ whereis nginx

配置目录:$ tree -F /etc/nginx

bash
/etc/nginx/                      # Nginx 主配置目录
├── conf.d/ # 额外配置文件目录,自动包含 *.conf
├── fastcgi.conf # FastCGI 配置(用于 PHP 等)
├── fastcgi_params # FastCGI 参数(旧版格式)
├── koi-utf # KOI8 到 UTF 编码转换(俄语支持)
├── koi-win # KOI8 到 Windows 编码转换
├── mime.types # 文件扩展名与 MIME 类型映射表
├── modules-available/ # 可用的动态模块(可能为空)
├── modules-enabled/ # 启用的动态模块(通常是软链接)
├── nginx.conf # 主配置文件,Nginx 的入口配置
├── proxy_params # 反向代理的默认参数
├── scgi_params # SCGI 服务参数
├── sites-available/ # 可用站点配置目录(不自动生效)
│   └── default # 默认站点配置文件
├── sites-enabled/ # 启用站点配置(软链接指向 available)
│   └── default -> /etc/nginx/sites-available/default
├── snippets/ # 公共配置片段目录
│   ├── fastcgi-php.conf # PHP FastCGI 配置片段
│   └── snakeoil.conf # 示例 SSL 配置(伪造测试证书)
├── uwsgi_params # uWSGI 服务参数
└── win-utf # Windows 编码支持文件

7 directories, 14 files

最重要的是 sites-availablesites-enabled 目录:在 sites-available 目录下创建每个网站的配置文件,链接到 sites-enabled 启用配置。

6.Nginx 配置域

6.1 主配置文件与 http 块

nginx
user www-data;                                # 指定 Nginx 以哪个用户身份运行(通常是低权限用户)
worker_processes auto; # 自动设置工作进程数量(等于 CPU 核心数)
pid /run/nginx.pid; # 指定存放 Nginx 主进程的 PID 文件路径
error_log /var/log/nginx/error.log; # 错误日志文件路径

include /etc/nginx/modules-enabled/*.conf; # 引入已启用的动态模块配置

events {
worker_connections 768; # 每个工作进程的最大连接数
}

http {
sendfile on; # 启用高效的 sendfile 系统调用(用于静态文件传输)
tcp_nopush on; # 减少网络包数量,提高效率(与 sendfile 搭配)

types_hash_max_size 2048; # MIME 类型哈希表的最大大小

include /etc/nginx/mime.types; # 包含 MIME 类型映射表
default_type application/octet-stream; # 默认的 MIME 类型(找不到类型时使用)

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 启用的 SSL 协议(禁用不安全的 SSLv2/3)
ssl_prefer_server_ciphers on; # 使用服务器端指定的加密算法优先

access_log /var/log/nginx/access.log; # 访问日志文件路径

gzip on; # 启用 gzip 压缩,提升传输效率

include /etc/nginx/conf.d/*.conf; # 引入 conf.d 目录下的所有配置(通常用于服务段落)
include /etc/nginx/sites-enabled/*; # 引入启用的虚拟主机配置文件
}

主配置文件包含 全局配置 和 http 块。http 块主要负责配置 与 HTTP 协议相关的所有内容

6.2 Server 块

server 块负责配置一个 虚拟主机(网站实例) 的相关信息,主要用于定义如何响应特定的请求(如域名、端口、路径等)。

nginx
server {
listen 80 default_server; # 监听 IPv4 的 80 端口,作为默认站点
listen [::]:80 default_server; # 监听 IPv6 的 80 端口,作为默认站点

root /var/www/html; # 网站根目录
index index.html index.htm index.nginx-debian.html; # 默认首页文件

server_name _; # 匹配所有未被其他 server 捕获的请求

location / {
try_files $uri $uri/ =404; # 如果文件或目录不存在,则返回 404
}
}

以上是默认 Nginx 默认 server 块配置文件,处理所有来自 80 端口的默认请求:

用户可以添加多个 server 块配置文件到 sites-available 目录下。

7.Nginx 静态网站

7.1 配置 server 块

问:用户访问 www.zxzsk.com 时,Nginx 服务器是如何处理请求的?

答:Nginx 根据 Server 块中的配置进行处理,配置如下:

nginx
server {
listen 80;
listen [::]:80;
server_name www.zxzsk.com; #指定域名
root /var/www/www.zxzsk.com; #网站目录
index index.html index.htm; #首页可识别文件
charset utf-8;
location / {
try_files $uri $uri/ =404;
}
# 错误页面配置
error_page 404 /404.html;
location = /404.html {
internal;
}
# 访问日志和错误日志路径
access_log /var/log/nginx/www.zxzsk.com.access.log;
error_log /var/log/nginx/www.zxzsk.com.error.log;
}

前提:已将域名 www.zxzsk.com 解析到 Nginx 服务器。

效果:通过 http://www.zxzsk.com 访问网站

位置:添加配置文件到 sites-available 目录,通过符号链接到 sites-enabled 目录启用配置;删除链接则禁用配置。

nginx
# 符号链接
sudo ln -s /etc/nginx/sites-available/www.zxzsk.com.conf /etc/nginx/sites-enabled/

# 重载配置前检查语法错误
sudo nginx -t

# 重载配置
sudo systemctl reload nginx

7.2 前端地址使用 SSL 证书(Certbot 自动申请和配置 SSL)

前提:完成了 http 配置

安装 Certbot

bash
sudo apt update
sudo apt install certbot

申请和配置 SSL 证书

bash
sudo certbot --nginx -d blog.zxzsk.com -d www.example.com

-d 域名 申请证书,可以同时申请多个域名的证书。如果使用的是 Apache 服务器,则将 --nginx 改为 --apache。获取证书成功后,自动添加 SSL 证书配置到配置文件。

效果:通过 https://www.zxzsk.com 访问网站,更加安全!

关于 SSL 证书自动续期

证书由 Let's Encrypt 颁发,效期为 90 天。默认情况下 Certbot 自动创建证书效期监测和续期服务。你可以通过以下命令测试证书续期:

bash
sudo certbot renew --dry-run

8.Nginx 反向代理

8.1 代理后端地址

nginx
# /etc/nginx/sites-available/a.zxzsk.com
server {
listen 80;
server_name a.zxzsk.com; # 前端地址
location / {
proxy_pass http://10.10.10.33:8080;

# 将客户端请求信息中的host信息传递给后端服务器
proxy_set_header Host $host;

# 客户端的ip传递给后端服务器
proxy_set_header X-Real-IP $remote_addr;

# 记录代理服务器ip,并传递给后端服务器
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

场景:通过前端地址 http://a.zxzsk.com 访问后端地址 http://10.10.10.33:8080

SSL 证书的申请和获取参照 7.2 Certbot 。

8.2 后端地址使用 SSL 证书

nginx
# /etc/nginx/sites-available/b.zxzsk.com
server {
listen 80;
server_name a.zxzsk.com;

location / {
proxy_pass https://soulio.cn; # ✅ 使用 https 协议

# 开启 SNI 支持(TLS 多域名识别)
proxy_ssl_server_name on;

# 如果后端是自签证书,可关闭验证(建议生产开启验证)
proxy_ssl_verify off;

# 保留客户端请求头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

效果:通过 http://b.zxzsk.com 访问 https://soulio.cn

同样 SSL 证书的配置参照 7.2 Certbot 。

9.Nginx 负载均衡

用途:启用多个后端地址,部分后端服务器宕机也不影响服务。

9.1 一对多

nginx
# /etc/nginx/sites-available/zxzsk.com
server {
listen 80;
server_name zxzsk.com;

location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

# 定义上游后端服务器池
upstream backend_pool {
server 10.10.10.33:8080 weight=3;
server 10.10.10.33:8081 weight=1;
}

权重:默认是 1,后端地址被访问概率 = 单权重/总权重。

9.2 多对多

nginx
# a.example.com 和 b.example.com 都使用 backend_pool
server {
listen 80;
server_name a.example.com b.example.com;

location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

# 定义后端服务器池,自动轮询、负载均衡
upstream backend_pool {
server 192.168.10.2:8080 weight=3;
server 192.168.10.2:8081 weight=2;
}