Nginx快速上手

/ 项目部署

什么是nginx

Nginx 是一款开源的高性能 HTTP 和反向代理服务器,同时也提供了 IMAP/POP3/SMTP 代理功能。它由俄罗斯程序员 Igor Sysoev 于2004年首次发布,最初设计目的是为了解决 C10k 问题,即如何让单台服务器同时处理1万个并发连接的问题。

功能和作用

Nginx 主要的功能和作用包括但不限于以下几点:

  1. Web服务器:Nginx 可以作为一个轻量级的 Web 服务器来处理静态文件、索引文件和自动索引等。
  2. 反向代理服务器:作为反向代理,Nginx 可以接收客户端请求并将其转发给后端的一个或多个服务器进行处理,然后将处理结果返回给客户端。这种架构有助于分担后端服务器的负载,提高系统的可用性和性能。
  3. 负载均衡器:Nginx 提供了多种负载均衡算法(如轮询、最少连接、IP哈希等),可以将客户端请求分配到多个后端服务器上,从而实现高可用性和扩展性。
  4. 缓存服务器:Nginx 可以缓存静态内容和动态生成的页面,减少对后端服务器的请求数量,提升网站响应速度。
  5. SSL/TLS 支持:Nginx 支持 SSL/TLS 协议,能够提供 HTTPS 服务,保障数据传输的安全。
  6. 动静分离:Nginx 可以高效地处理静态资源,并将动态请求代理到后端应用服务器,以此加快网站解析速度。
  7. 安全防护:Nginx 提供了一定的安全防护功能,比如通过配置访问控制列表(ACL)限制特定 IP 地址或 IP 段的访问。
  8. 邮件代理服务器:Nginx 还支持 IMAP、POP3 和 SMTP 协议,可用于代理和负载均衡邮件服务器的请求。

历史发展

Nginx 的成功在于其采用了事件驱动的异步非阻塞处理模型,这使得它在处理高并发请求时表现出色。此外,Nginx 的模块化设计允许用户根据需要灵活扩展其功能。它的配置文件结构清晰,易于理解和修改,支持丰富的配置选项,便于定制化部署。正因为这些特性,Nginx 已经成为构建高性能 Web 应用程序、负载均衡集群和反向代理的理想选择。

下载nginx?

  1. 访问官方网站:首先,访问 Nginx 的官方网站 nginx.org
  2. 下载 Windows 版本:从官网的下载页面获取 Windows 版本的 Nginx。通常,你会找到一个如 nginx-x.x.xx.zip 的链接(这里的 x.x.xx 是版本号),点击下载这个压缩包。

安装 Nginx

  1. 解压文件:将下载的 .zip 文件解压到你希望安装 Nginx 的目录,例如 C:\nginx\

  2. 启动 Nginx

    • 打开命令提示符(以管理员身份运行),然后导航到 Nginx 的安装目录下的 sbin 文件夹。例如,如果你把 Nginx 解压到了 C:\nginx\,那么你应该执行:

      1
      cd C:\nginx\nginx-1.26.3\  (根据实际解压后的文件夹名称调整路径)
    • 然后,输入以下命令来启动 Nginx:

      1
      start nginx

      或者直接双击 nginx.exe 来启动它。

  3. 验证安装

    • 打开浏览器,访问 http://localhost/。如果看到欢迎页面,说明 Nginx 已经成功安装并正在运行。

配置环境变量

如果你想在任何地方都能使用 nginx 命令,可以配置环境变量:

  1. 添加到系统环境变量

    • 右键点击“此电脑”或“我的电脑”,选择“属性”。
    • 点击左侧的“高级系统设置”。
    • 在弹出的窗口中,点击“环境变量”按钮。
    • 在“系统变量”部分,找到并选择 Path 变量,然后点击“编辑”。
    • 在编辑窗口中,点击“新建”,然后输入 Nginx 的 sbin 目录路径,例如 C:\nginx\nginx-1.26.3\(确保指向正确的路径)。
    • 确认所有对话框都已保存并关闭。
  2. 验证配置是否成功

    • 打开一个新的命令提示符窗口,输入 nginx -v 来检查是否能够识别 Nginx 命令以及查看其版本信息。

PID?

PID,全称为Process Identifier(进程标识符),是操作系统为了管理和识别运行中的每个进程而分配的一个唯一数字标识符。在任何给定时间点,操作系统中运行的所有进程都有一个唯一的PID值,这使得操作系统能够对这些进程进行管理、监控和控制。

PID的作用

如何查看PID

不同的操作系统提供了不同的工具来查看正在运行的进程及其PID:

发送信号给进程

在Unix/Linux系统中,经常需要向特定进程发送信号以触发某些行为(如重新加载配置、优雅地关闭服务等)。这通常通过PID来实现。例如,向Nginx发送重新加载配置的信号:

1
sudo kill -HUP `cat /var/run/nginx.pid`

服务启停

基本操作

启动 Nginx

停止 Nginx

重新加载配置(不停机重载)

检查配置文件语法

在管理和操作Nginx服务时,查看进程信息、发送信号给Nginx进程是常见的任务。下面介绍如何查看Nginx的进程ID(PID)以及如何使用nginx -s命令发送信号给Nginx。

在Windows操作系统上管理和操作Nginx服务时,查看进程信息和发送信号给Nginx进程的操作与Linux/macOS有所不同。以下是针对Windows环境的具体指南:

查看Nginx进程

在Windows上,你可以使用以下几种方法来查看Nginx的进程信息:

获取Nginx主进程PID

在Windows版本的Nginx中,默认情况下也会将主进程的PID写入一个文件中。这个文件的位置取决于你的配置文件设置,但通常可以在Nginx安装目录下的logs文件夹中的nginx.pid找到。例如,如果Nginx安装在C:\nginx\目录下,则可以使用以下命令查看主进程PID:

1
type C:\nginx\logs\nginx.pid

使用nginx -s发送信号

在Windows上,你可以通过nginx -s命令向Nginx发送信号以执行不同的操作,如重新加载配置或停止服务。这包括:

这些命令需要在命令提示符窗口中执行,并且应该从Nginx的安装目录运行,或者确保你的系统路径包含Nginx的可执行文件路径。在某些情况下,可能需要以管理员身份运行命令提示符来执行这些命令。

注意事项

Nginx基础结构

  1. Master进程
    • 作用:Master进程是Nginx的主进程,负责管理其他进程和配置文件的加载。它不直接处理客户端请求,而是负责监听端口、接收新连接,并将连接分配给Worker进程。
    • 特点:Master进程具有特权,通常以root用户身份运行,以便能够绑定到特权端口(如80和443)。
  2. Worker进程
    • 作用:Worker进程是实际处理客户端请求的进程。每个Worker进程都是独立的,可以处理多个客户端请求。
    • 特点:Worker进程通常以非特权用户身份运行,以提高安全性。它们通过事件驱动和异步非阻塞的方式处理请求,能够高效地处理大量并发连接。
  3. Cache Manager进程(可选)
    • 作用:Cache Manager进程负责管理Nginx的缓存。它定期清理和更新缓存,确保缓存的有效性和空间利用率。
  4. Cache Loader进程(可选)
    • 作用:Cache Loader进程在Nginx启动时预加载缓存内容。这有助于减少启动时间,并提高缓存的命中率。
  5. 配置模块
    • 作用:Nginx的配置文件(如nginx.conf)定义了服务器的行为,包括监听的端口、虚拟主机、反向代理设置、负载均衡策略等。
    • 特点:Nginx的配置文件非常灵活,支持模块化扩展,可以根据需要进行定制。
  6. 事件驱动模型
    • 作用:Nginx采用事件驱动模型,通过epoll(在Linux上)或kqueue(在FreeBSD上)等高效的多路复用机制,实现高并发处理。
    • 特点:事件驱动模型使得Nginx能够以少量的资源处理大量的并发连接,减少上下文切换的开销,提高性能。

Nginx配置文件

Nginx配置文件是控制Nginx服务器行为的核心。一个典型的Nginx配置文件(通常命名为nginx.conf)由多个部分组成,每个部分都有其特定的功能和用途。

1
nginx -V

你可以通过上面指令来查看文件路径,--conf-path=“相对路径”明确指出了配置文件的所在位置

1. 全局块(Global Block)

位于配置文件最外层,定义了影响整个Nginx进程的参数。

2. Events 块

配置与事件驱动模型相关的设置。

3. HTTP 块

这是Nginx配置中最复杂的部分,包含了处理HTTP请求的所有相关配置。

4. Server 块

定义虚拟主机配置,允许你基于不同的域名或IP地址提供不同的服务。

5. Location 块

用于匹配不同的URI请求,并对这些请求执行特定的操作。

6. Upstream 块(如果需要负载均衡)

用于定义一组后端服务器,实现负载均衡。

7. 其他重要指令

通过合理配置上述各部分,可以根据具体需求定制Nginx的行为,以满足高性能Web服务的要求。例如,你可以设置静态资源缓存策略、启用SSL/TLS安全连接、配置反向代理以支持动态内容处理等。每种配置都需要仔细考虑其对性能、安全性和维护性的影响。

静态站点的部署

1. 准备静态资源

首先,你需要确保你的静态网站已经构建完成,并且所有的资源文件(HTML, CSS, JavaScript, 图片等)都已准备好。如果你使用的是前端框架或工具(如React, Vue, Hugo等),你可能需要先运行构建命令生成最终的静态资源文件。

2. 配置Nginx

接下来,你需要配置Nginx以正确地服务这些静态文件。这通常涉及到编辑Nginx的配置文件(通常是nginx.conf或者位于sites-available目录下的某个配置文件)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
server_name example.com;

location / {
root /path/to/your/static/site; # 设置静态文件的根目录
index index.html; # 默认首页
try_files $uri $uri/ /index.html; # 对于单页应用(SPA)特别有用
}

error_page 404 /404.html;
location = /404.html {
root /path/to/your/static/site;
}
}

在这个配置中,你需要替换example.com为你的域名,并设置正确的root路径指向你静态站点所在的目录。

3. 测试并重新加载Nginx配置

在保存了新的配置后,你应该测试Nginx配置是否有语法错误,并重新加载Nginx使更改生效。可以使用以下命令:

1
2
sudo nginx -t # 测试配置文件的正确性
sudo nginx -s reload # 重新加载Nginx配置

4. 上传静态资源

如果静态资源不在服务器上,你需要将它们上传到服务器上的指定目录(即你在Nginx配置中定义的root路径)。你可以使用SCP、FTP或其他文件传输方式来完成这项工作。

5. 访问您的网站

一旦完成上述步骤,理论上你应该可以通过浏览器访问你的静态网站了。只需在地址栏输入你的域名或服务器IP地址即可。

注意事项

配置进程数量

在Nginx中配置工作进程的数量是非常重要的,因为它直接影响到服务器的性能和资源利用效率。工作进程负责处理客户端请求,因此合理设置worker_processes的数量可以提高服务器响应速度和吞吐量。

配置方法

Nginx的工作进程数量是在主配置文件(通常是nginx.conf)的全局块中通过worker_processes指令来定义的。以下是几种常见的配置方式:

  1. 根据CPU核心数自动调整
    这是最常用的方式之一,它允许Nginx根据服务器的CPU核心数自动决定最佳的工作进程数。

    1
    worker_processes auto;

    使用auto关键字可以让Nginx自动检测并设置为最佳值,这通常等于服务器的CPU核心数。

  2. 手动指定具体数值
    如果你对服务器负载情况非常了解,并且想要手动控制工作进程的数量,可以直接指定一个具体的数字。

    1
    worker_processes 4; # 假设你的服务器有4个CPU核心
  3. 基于其他因素调整
    在某些情况下,可能需要考虑除了CPU核心数之外的因素,比如I/O等待时间、网络延迟等。虽然直接与这些因素相关的配置并不多,但你可以通过试验不同的worker_processes设置找到最适合你应用环境的配置。

相关优化建议

反向代理

反向代理是一种常见的网络服务部署模式,特别是在处理Web请求时非常有用。它允许客户端发送请求到一个代理服务器,然后由这个代理服务器将请求转发给后端的实际服务器(可以是一个或多个),并将响应返回给客户端。

配置反向代理的基本步骤

  1. 安装Nginx:确保你的系统上已经安装了Nginx。如果没有,请根据你的操作系统选择合适的安装方法。

  2. 编辑Nginx配置文件:你需要编辑Nginx的主要配置文件(通常是nginx.conf或者位于sites-available目录下的某个配置文件)以添加反向代理设置。

  3. 配置反向代理:使用location块结合proxy_pass指令指定后端服务器的地址。

示例

假设你有一个运行在本地8080端口的应用服务器,并希望使用Nginx作为前端反向代理服务器。

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80; # 监听HTTP请求的80端口
server_name example.com; # 你的域名

location / {
proxy_pass http://127.0.0.1:8080; # 指定后端服务器的地址和端口
proxy_set_header Host $host; # 将原始请求的Host头部传递给后端服务器
proxy_set_header X-Real-IP $remote_addr; # 获得原始请求的真实IP地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 为代理链路中的每个代理添加客户端IP地址
proxy_set_header X-Forwarded-Proto $scheme; # 标识客户端请求使用的协议(http或https)
}
}

负载均衡

在Nginx中配置负载均衡可以帮助你将客户端请求分发到多个后端服务器,从而提高应用的可用性和扩展性。通过负载均衡,不仅可以实现更高的处理能力,还能在后端服务器故障时提供冗余支持,确保服务的连续性。

基本步骤

  1. 定义上游服务器组:首先需要使用upstream指令定义一个包含所有后端服务器的组。
  2. 配置反向代理:然后,在server块中的适当location里使用proxy_pass指令指向这个上游服务器组。

示例配置

假设你有三台后端服务器(backend1.example.com, backend2.example.com, backend3.example.com),你可以按照以下方式配置Nginx:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
http {
upstream backend_servers {
# 定义一组后端服务器
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;

# 可选: 使用最少连接策略
# least_conn;

# 可选: 为每个服务器设置权重,数值越高,分配到的概率越大
# server backend1.example.com weight=3;
# server backend2.example.com weight=2;
# server backend3.example.com weight=1;
}

server {
listen 80; # 监听HTTP请求的80端口
server_name example.com; # 你的域名

location / {
proxy_pass http://backend_servers; # 将请求转发给上游服务器组

# 设置头部信息以保持会话一致性等
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}

负载均衡策略

Nginx支持多种负载均衡算法,默认是轮询(Round Robin)。此外,还可以选择其他几种策略:

健康检查

虽然Nginx本身不直接支持健康检查,但可以通过第三方模块或结合其他工具(如Consul、Zookeeper等)实现。Nginx Plus版本提供了内置的健康检查功能。

配置测试与重新加载

完成配置后,请务必进行配置文件正确性的检查:

1
sudo nginx -t

如果一切正常,重新加载Nginx使新的配置生效:

1
sudo nginx -s reload

配置HTTPS

配置HTTPS对于确保网站的安全性至关重要,它通过SSL/TLS协议加密客户端和服务器之间的通信,保护数据的隐私和完整性。在Nginx中配置HTTPS主要涉及获取SSL证书并编辑Nginx配置文件以启用SSL/TLS。

1. 获取SSL证书

你可以从可信的证书颁发机构(CA)购买SSL证书,或者使用Let’s Encrypt等提供免费证书的服务。以下是以Let’s Encrypt为例,如何获取证书:

2. 配置Nginx支持HTTPS

获取证书后,你需要编辑Nginx的配置文件来启用HTTPS。通常位于/etc/nginx/nginx.conf/etc/nginx/sites-available/default(具体取决于你的系统和配置)。一个基本的HTTPS配置示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 80; # 监听HTTP请求
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri; # 将所有HTTP请求重定向到HTTPS
}

server {
listen 443 ssl; # 监听HTTPS请求
server_name yourdomain.com www.yourdomain.com;

ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # SSL证书路径
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 私钥路径

ssl_protocols TLSv1.2 TLSv1.3; # 只启用安全的TLS协议版本
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!MD5;

location / {
# 你的其他配置...
}
}

3. 测试并重新加载Nginx配置

完成上述配置后,先测试配置文件是否有语法错误:

1
sudo nginx -t

如果测试成功,重新加载Nginx使新的配置生效:

1
sudo systemctl reload nginx

4. 自动更新证书(针对Let’s Encrypt)

Let’s Encrypt提供的证书有效期为90天,建议设置定期任务(cron job)自动更新证书。Certbot会自动添加一个定时任务来处理这个问题,但你也可以手动检查更新:

1
sudo certbot renew --dry-run

设置虚拟主机

假设你想在同一台服务器上托管两个不同的网站site1.example.comsite2.example.com

  1. 基于域名的虚拟主机配置

    打开nginx.conf或创建一个新配置文件(如vhosts.conf)并在其中添加如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    server {
    listen 80;
    server_name site1.example.com;

    location / {
    root C:/nginx/html/site1; # 注意路径格式使用正斜杠(/)且盘符后也要有斜杠
    index index.html index.htm;
    }
    }

    server {
    listen 80;
    server_name site2.example.com;

    location / {
    root C:/nginx/html/site2;
    index index.html index.htm;
    }
    }
  2. 确保配置正确:保存对配置文件的修改后,你需要测试配置是否正确。打开命令提示符并输入以下命令:

    1
    nginx -t
  3. 重新加载Nginx:如果配置测试成功,可以通过以下命令重新加载Nginx使新的配置生效:

    1
    nginx -s reload

注意事项