Nginx实战与应用场景详解
Nginx实战与应用场景详解

汇总了在工作中遇到的各种 Nginx 使用场景,对这篇文章进行了细致的整理和层次分明的讲解,旨在提供简洁而深入的内容。希望这能为你提供帮助和启发! 对于前端开发人员来说,Node.js 是一种熟悉的技术。虽然 Nginx 和 Node.js 在某些理念上有相似之处,比如都支持 HTTP 服务、事件驱动和异步非阻塞操作,但两者并不冲突,各有各自擅长的领域: Nginx:擅长处理底层的服务器端资源,如静态资源处理、反向代理和负载均衡。 Node.js:更擅长处理上层的具体业务逻辑。

而两者的结合可以实现更加高效和强大的应用服务架构,下面我们就来看一下。

一、Nginx 是什么?

Nginx是一个高性能的HTTP和反向代理服务器,由俄罗斯程序员Igor Sysoev于 2004 年使用 C 语言开发。它最初设计是为了应对俄罗斯大型门户网站的高流量挑战。

二、反向代理是什么?

让我们先从代理说起。Nginx 常被用作反向代理,那么什么是正向代理呢?

正向代理:客户端知道要访问的服务器地址,但服务器只知道请求来自某个代理,而不清楚具体的客户端。正向代理隐藏了真实客户端的信息。例如,当无法直接访问国外网站时,我们通过代理服务器访问特定网址。

反向代理:多个客户端向反向代理服务器发送请求,Nginx 根据一定的规则将请求转发至不同的服务器。客户端不知道具体请求将被转发至哪台服务器,反向代理隐藏了后端服务器的信息。

三、Nginx 的核心特性

Nginx包含以下七个核心特性,使它成为处理高并发和大数据量请求的理想选择:

  1. 事件驱动:Nginx采用高效的异步事件模型,利用 I/O 多路复用技术。这种模型使 Nginx 能在占用最小内存的同时处理大量并发连接。
  2. 高度可扩展:Nginx能够支持数千乃至数万个并发连接,非常适合大型网站和高并发应用。例如:为不同的虚拟主机设置不同的 worker 进程数,以增加并发处理能力 http { worker_processes auto; # 根据系统CPU核心数自动设置worker进程数 }
  3. 轻量级:相较于传统的基于进程的Web服务器(如Apache),Nginx的内存占用更低,得益于其事件驱动模型,每个连接只占用极小的内存空间。
  4. 热部署:Nginx支持热部署功能,允许在不重启服务器的情况下更新配置和模块。例如:在修改了 Nginx 配置文件后,可以快速热部署 Nginx 配置:sh代码解读复制代码sudo nginx -s reload
  5. 负载均衡:Nginx内置负载均衡功能,通过upstream模块实现客户端请求在多个后端服务器间的分配,从而提高服务的整体处理能力。以下是一个简单的upstream配置,它将请求轮询分配到三个后端服务器:
upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

server {
    location / {
        proxy_pass http://backend; # 将请求转发到upstream定义的backend组
    }
}
  1. 高性能:Nginx 在多项 Web 性能测试中表现卓越,能快速处理静态文件、索引文件及代理请求。比如:配置 Nginx 作为反向代理服务器,为大型静态文件下载服务: location /files/ { alias /path/to/files/; # 设置实际文件存储路径 expires 30d; # 设置文件过期时间为30天 }
  2. 安全性:Nginx支持SSL/TLS协议,能够作为安全的Web服务器或反向代理使用。
server {
  listen 443 ssl;
  ssl_certificate /path/to/fullchain.pem; # 证书路径
  ssl_certificate_key /path/to/privatekey.pem; # 私钥路径
  ssl_protocols TLSv1.2 TLSv1.3; # 支持的SSL协议
}

四、搭建 Nginx 服务

如何安装Nginx?在 Linux 系统中,可以使用包管理器来安装 Nginx。例如,在基于 Debian 的系统上,可以使用 apt :

sudo apt update
sudo apt install nginx

在基于 Red Hat 的系统上,可以使用 yum 或 dnf:

sudo yum install epel-release
sudo yum install nginx

在安装完成后,通常可以通过以下命令启动 Nginx 服务:

sudo systemctl start nginx

# 或设置开机自启动:

sudo systemctl enable nginx

启动成功后,在浏览器输入服务器 ip 地址或者域名,如果看到 Nginx 的默认欢迎页面,说明 Nginx 运行成功。

五、常用命令

以下是一些常用的 Nginx 脚本命令,这些脚本通常用于 Bash 环境下:

# 启动 Nginx:
nginx
# 停止 Nginx:
nginx -s stop
# 重新加载 Nginx:
nginx -s reload
# 检查 Nginx 配置文件(检查配置文件的正确性):
nginx -t
# 查看 Nginx 版本:
nginx -v

其他常用的配合脚本命令:

# 查看进程命令:
ps -ef | grep nginx
# 查看日志,在logs目录下输入指令:
more access.log

六、配置文件构成

主要由以下几部分构成:全局块、HTTP 块、Server 块、Location 块。

全局块(Global Block)

全局块位于 Nginx 配置文件的顶部,它包含影响整个 Nginx 服务器的设置。通常,这里会配置用户和工作进程数量等信息。

# 使用哪个用户和用户组来运行 Nginx 服务
user nginx;

# 自动检测 CPU 核心数,并根据核心数设置工作进程数。
worker_processes auto;

# 指定存储 Nginx 进程 ID 的文件位置。
pid /var/run/nginx.pid;

# 设置错误日志的路径和日志记录的级别(例如 `warn` 表示警告级别)。
error_log /var/log/nginx/error.log warn;

# worker_connections定义每个worker进程可以同时打开的最大连接数 
events {   
    worker_connections 1024;  
}  

HTTP 块(HTTP Block)

HTTP 块包含了与 HTTP 服务相关的配置。这里可以定义多种 Server 块、日志设置、全局 HTTP 选项等。

http {
    # 定义使用的日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 指定访问日志的路径,并使用自定义的日志格式 `main`。
    access_log /var/log/nginx/access.log main;

    # 引入 MIME 类型配置文件,以便正确地为不同文件类型设置 Content-Type
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 设置客户端保持连接的超时时间为 65 秒
    keepalive_timeout 65;

    # 开启 gzip 压缩,以减少传输数据的体积
    gzip on;
}

Server 块(Server Block)

Server 块用于定义虚拟主机,每个 Server 块对应一个网站或服务。在这里可以配置域名、监听端口以及与此域名相关的特定设置。

server {
    # 监听 80 端口,这通常是 HTTP 默认的端口
    listen 80;

    # 定义服务器的域名,可以指定多个别名
    server_name example.com www.example.com;

    # 指定网站的根目录
    root /var/www/example;

    # 定义默认首页文件,当用户请求根路径时会加载这些文件
    index index.html index.htm;

    # 指定自定义的 404 错误页面
    error_page 404 /404.html;

    # 为该服务器定义专用的访问日志
    access_log /var/log/nginx/example_access.log main;

    # 处理根路径的请求,这里使用 `try_files` 尝试匹配文件或目录,如果无法匹配则返回 404
    location / {
        try_files $uri $uri/ =404;
    }

    # 为 `/images/` 路径下的静态资源配置缓存策略,让这些资源在客户端缓存 30 天
    location /images/ {
        expires 30d;
    }
}

Location 块(Location Block)

Location 块用于匹配客户端请求的 URL 路径,并根据匹配结果执行特定的配置。Location 块可以包含在 Server 块中,也可以嵌套在其他 Location 块中。

location / {
    # 尝试查找文件或目录,若找不到则返回404
    try_files $uri $uri/ =404;
}

location /images/ {
    # 设置静态文件的缓存时间
    expires 30d;
}

location /api/ {
    # 反向代理,将请求转发到其他服务器
    proxy_pass http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
  • location /:默认的路径匹配,用于处理根路径请求。
  • location /images/:匹配所有 /images/ 开头的请求,主要用于处理静态资源。
  • location /api/:匹配所有 /api/ 开头的请求,并将这些请求反向代理到后端服务器 http://backend_server