前言
最近在折腾搭建个人博客、图床这些东西,不可避免地接触到了 Nginx 的一些相关知识,借此机会总结一下实战中学习到的 Nginx 知识,以 Ubuntu 22.04 为例。
Nginx 是什么
Nginx 是一个高性能的 Web 服务器和反向代理服务器。它常用于处理大量并发连接,特别擅长提供静态资源服务,比如 HTML、CSS、图片等。同时,它也可以把用户请求转发到后端服务器(如 Node.js、Java、PHP 等),这就是所谓的反向代理。
相比传统 Web 服务器,Nginx 更加轻量、高效,能在低资源消耗的情况下处理更多请求,因此广泛应用于中大型网站和系统中。
Nginx 和 Tomcat 的区别
简而言之:
- Nginx 擅长处理静态资源,比如图片、CSS、JavaScript 文件,速度快、占用资源少。同时,它还能做反向代理,把用户请求转发给后端服务器,实现负载均衡,分担压力。
- Tomcat 是一个 Servlet 容器,专门用来运行 Java Web 应用程序,比如 Spring Boot。它负责执行 Java 代码,处理业务逻辑,生成动态内容。
Nginx 配置目录
主配置文件
主配置文件通常位于:
/etc/nginx/nginx.conf
两个常用配置目录
实战中接触最多的两个目录是:
/etc/nginx/sites-available/
/etc/nginx/sites-enabled/
sites-available 与 sites-enabled 区别
在实际部署中,为了方便管理站点配置,Debian/Ubuntu 系列系统通常会使用以下两个目录:
/etc/nginx/sites-available
:存放所有可用的站点配置文件,但不会自动生效。/etc/nginx/sites-enabled
:存放已启用站点的配置文件(通常是对sites-available
中相应文件的符号链接)。
工作流程:
- 在
sites-available
中编写或存放站点配置,如example.com.conf
。 - 使用命令创建符号链接:
ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
- 使用命令验证配置是否有问题:
sudo nginx -t
- 重新加载 Nginx:
sudo nginx -s reload
Nginx 只会加载
sites-enabled
目录下的配置,实现快速启用或停用站点:- 启用站点:在
sites-enabled
添加链接。 - 停用站点:删除
sites-enabled
中的链接,无需删除源文件。
- 启用站点:在
提示:
- CentOS/RHEL 系统通常使用
/etc/nginx/conf.d
目录,所有.conf
文件会被自动加载,不区分可用与已启用。
域名到页面的定位流程
当浏览器在地址栏输入某个域名并发起 HTTP 请求时,Nginx 会按照以下步骤,逐层定位到要返回的页面:
- 加载所有虚拟主机配置
Nginx 会将/etc/nginx/sites-enabled/
目录下所有.conf
文件中的server
块加载,就好像它们是一份大配置文件。 端口和主机匹配
- 端口匹配:Nginx 首先确认请求使用的端口(如 80 或 443),只在对应端口的
server
块中查找。 - 域名匹配:读取请求报文中的
Host
头,与server_name
指令进行匹配。
- 端口匹配:Nginx 首先确认请求使用的端口(如 80 或 443),只在对应端口的
- server_name 匹配优先级
a. 精确匹配(如www.example.com
)
b. 通配符匹配(如*.example.com
)
c. 正则匹配(以~
标记)
d. 默认服务器:若上述都未命中,则使用标记为default_server
的主机,或按配置文件中首个server
。 - location 路径匹配
在选中的server
块中,Nginx 按照location
指令定义的规则(如/
、/images/
、~ \.php$
等)逐条匹配,找到最合适的规则后执行相应操作。 资源定位与返回
- 若是静态资源:根据匹配的
root
或alias
路径查找文件并返回。 - 若是代理或其他处理:则根据
proxy_pass
、fastcgi_pass
等指令转发到后端。
- 若是静态资源:根据匹配的
静态资源定位与默认首页
在 Nginx 中,通过 root
和 index
指令来指定静态资源的根目录和默认首页:
location / {
root /usr/share/nginx/html; # 静态资源根目录
index index.html index.htm; # 默认首页文件名
}
- 当请求路径为
/
时,Nginx 会依次查找index.html
、index.htm
并返回给浏览器。 - 对于其他路径如
/images/logo.png
,Nginx 会在/usr/share/nginx/html/images/logo.png
下查找并返回静态文件。
Nginx 基础配置的各部分解释
# 全局设置
worker_processes 1; # 启动 1 个工作进程(可根据 CPU 核心数调整)
events {
worker_connections 1024; # 每个进程最大连接数
}
http {
# 定义一个虚拟主机
server {
listen 80; # 监听 80 端口
server_name localhost; # 本机测试用域名
# 根路径请求处理
location / {
root /usr/share/nginx/html; # 静态文件根目录
index index.html index.htm; # 默认首页文件名
}
}
}
nginx -s reload
和 sudo systemctl restart nginx
区别
总结与区分
nginx -s reload
:用于轻微配置文件修改的场景,不会重启 Nginx 进程。适用于大多数常见配置修改(如修改网站根目录、调整日志配置等),且不会中断当前连接。sudo systemctl restart nginx
:用于涉及服务运行的配置修改(如端口、模块等)或解决 Nginx 进程问题。重启服务会清除旧进程,检查配置有效性,并强制应用新的配置。
提示:
有关 Nginx 配置文件的调整,如果 nginx -s reload
不生效,不妨试试 sudo systemctl restart nginx
来强制重启服务并确保所有配置生效。