跳到主要内容

Nginx入门教程

1.Nginx 简介

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

Nginx 图标

2.Nginx 与网站

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

Nginx 与网站

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

3.Nginx 学习资源

img

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

  2. w3c Nginx 教程

  3. NGINX 开源社区

4.Nginx 安装部署

4.1 安装

Debian/Ubuntu:

sudo apt update
sudo apt install nginx

CentOS/RHEL:

sudo yum install epel-release
sudo yum install nginx

Fedora:

sudo dnf install nginx

mac:

brew install nginx
sudo nginx

4.2 启动

sudo systemctl enable nginx
sudo systemctl start nginx

5.Nginx 配置目录

安装目录:$ whereis nginx

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

/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 块

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

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 块中的配置进行处理,配置如下:

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 目录启用配置;删除链接则禁用配置。

# 符号链接
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

sudo apt update
sudo apt install certbot

申请和配置 SSL 证书

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 自动创建证书效期监测和续期服务。你可以通过以下命令测试证书续期:

sudo certbot renew --dry-run

8.Nginx 反向代理

8.1 代理后端地址

# /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 证书

# /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 一对多

# /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 多对多

# 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;
}