前言

最近在折腾搭建个人博客、图床这些东西,不可避免地接触到了 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 中相应文件的符号链接)。

工作流程:

  1. sites-available 中编写或存放站点配置,如 example.com.conf
  2. 使用命令创建符号链接:
ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
  1. 使用命令验证配置是否有问题:
sudo nginx -t
  1. 重新加载 Nginx:
sudo nginx -s reload
  1. Nginx 只会加载 sites-enabled 目录下的配置,实现快速启用或停用站点:

    • 启用站点:在 sites-enabled 添加链接。
    • 停用站点:删除 sites-enabled 中的链接,无需删除源文件。

提示:

  • CentOS/RHEL 系统通常使用 /etc/nginx/conf.d 目录,所有 .conf 文件会被自动加载,不区分可用与已启用。

域名到页面的定位流程

当浏览器在地址栏输入某个域名并发起 HTTP 请求时,Nginx 会按照以下步骤,逐层定位到要返回的页面:

  1. 加载所有虚拟主机配置
    Nginx 会将 /etc/nginx/sites-enabled/ 目录下所有 .conf 文件中的 server 块加载,就好像它们是一份大配置文件。
  2. 端口和主机匹配

    • 端口匹配:Nginx 首先确认请求使用的端口(如 80 或 443),只在对应端口的 server 块中查找。
    • 域名匹配:读取请求报文中的 Host 头,与 server_name 指令进行匹配。
  3. server_name 匹配优先级
    a. 精确匹配(如 www.example.com
    b. 通配符匹配(如 *.example.com
    c. 正则匹配(以 ~ 标记)
    d. 默认服务器:若上述都未命中,则使用标记为 default_server 的主机,或按配置文件中首个 server
  4. location 路径匹配
    在选中的 server 块中,Nginx 按照 location 指令定义的规则(如 //images/~ \.php$ 等)逐条匹配,找到最合适的规则后执行相应操作。
  5. 资源定位与返回

    • 若是静态资源:根据匹配的 rootalias 路径查找文件并返回。
    • 若是代理或其他处理:则根据 proxy_passfastcgi_pass 等指令转发到后端。

静态资源定位与默认首页

在 Nginx 中,通过 rootindex 指令来指定静态资源的根目录和默认首页:

location / {
    root   /usr/share/nginx/html;    # 静态资源根目录
    index  index.html index.htm;     # 默认首页文件名
}
  • 当请求路径为 / 时,Nginx 会依次查找 index.htmlindex.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 reloadsudo systemctl restart nginx 区别

总结与区分

  • nginx -s reload:用于轻微配置文件修改的场景,不会重启 Nginx 进程。适用于大多数常见配置修改(如修改网站根目录、调整日志配置等),且不会中断当前连接。
  • sudo systemctl restart nginx:用于涉及服务运行的配置修改(如端口、模块等)或解决 Nginx 进程问题。重启服务会清除旧进程,检查配置有效性,并强制应用新的配置。

提示

有关 Nginx 配置文件的调整,如果 nginx -s reload 不生效,不妨试试 sudo systemctl restart nginx 来强制重启服务并确保所有配置生效。