Nginx 简介
Nginx 是一款强大而高效的 Web 服务器,广泛应用于现代 Web 基础设施。与使用多线程架构的传统 Web 服务器不同,Nginx 采用非线程、事件驱动的架构。这种设计允许 Nginx 同时处理更多连接,非常适合高流量网站。
除了提供静态网页之外,Nginx 还功能多样,可以配置为执行各种角色,包括负载平衡、HTTP 缓存和充当反向代理。这些功能使其成为许多复杂 Web 架构的基石。
正向代理与反向代理
为了理解 Nginx 作为反向代理的作用,首先区分正向代理和反向代理会很有帮助。
- 正向代理:在传统的 HTTP 连接中,客户端直接向服务器发送请求。但是,使用正向代理(例如 VPN),客户端会将请求发送到代理,然后代理会将其转发到服务器。服务器不知道原始客户端;它只与代理交互。此设置对于隐私和绕过地理限制很有用。
- 反向代理:相反,反向代理位于客户端和多个服务器之间。客户端将请求发送到反向代理,然后反向代理决定哪个服务器应该处理该请求。客户端不知道哪个特定的服务器处理该请求。Nginx 因其效率和灵活性而成为反向代理的热门选择。
例如:
- /admin请求可以被路由到服务器 1。
- /settings请求可以被路由到服务器 2。
Nginx 可以有效地处理这些类型的路由,确保正确的服务器根据预定义的规则处理每个请求。
Nginx 的优点
Nginx 提供了几个关键优势,使其成为许多 Web 项目的首选:
- 高并发:能够处理10,000+个并发请求。
- HTTP 缓存:可以缓存 HTTP 请求,减少服务器负载并提高响应时间。
- 反向代理:充当反向代理,将客户端请求路由到适当的服务器。
- 负载平衡:在多台服务器之间分配传入的请求以平衡负载。
- API 网关:可以充当 API 网关,管理和路由 API 请求。
- 静态文件服务:有效地提供和缓存图像和视频等静态文件。
- SSL 终止:处理 SSL 证书,为用户提供安全连接。
安装和设置Nginx
- 使用Docker:
在本节中,我们将介绍使用 Docker 安装和设置 Nginx、进行配置以及设置示例项目的步骤。
步骤1:使用Docker安装Nginx
要在 Docker 容器中安装 Nginx,请按照以下步骤操作:
docker run -it -p 8080:80 ubuntup
此命令启动一个 Ubuntu 容器并将主机上的端口 8080 映射到容器中的端口 80。
接下来,更新软件包列表并安装 Nginx:
apt-get update
apt-get install nginx
您可以使用以下方法验证安装:
nginx -v
2. 在主机上:
sudo apt update
sudo apt install nginx
安装后,你可以使用以下命令启动 Nginx:
sudo systemctl start nginx
要检查状态:
sudo systemctl status nginx
Nginx 配置基础
Nginx 的主要配置文件是nginx.conf
。它通常位于/etc/nginx/nginx.conf
。让我们分解一个简单的 Nginx 配置文件:
worker_processes auto; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } } }
让我们了解这个文件的每个部分:
worker_processes auto;
此指令告诉 Nginx 启动多少个工作进程。工作进程负责处理请求。将其设置为auto
允许 Nginx 根据您的 CPU 核心自动确定最佳数量。
events { worker_connections 1024; }
该events
块设置连接处理设置。
worker_connections 1024;
意味着每个 worker 进程可以同时处理 1024 个连接。如果你有 4 个 worker 进程,那么你可以同时处理 4096 个连接。
http { ... }
- 该
http
块是您定义处理 HTTP 请求的设置的地方。您的大多数 Web 服务器配置都驻留在此。
include mime.types;
- 该指令告诉 Nginx 包含一个名为 的文件
mime.types
,该文件将文件扩展名映射到 MIME 类型。MIME 类型告诉浏览器如何处理不同类型的文件(例如,.html
text/html、.jpg
image/jpeg)。
default_type application/octet-stream;
- 如果 Nginx 无法确定文件的 MIME 类型,它将使用
application/octet-stream
后备方案,通常意味着“下载此文件”。
sendfile on;
- 该指令启用
sendfile
系统调用,允许 Nginx 绕过在缓冲区之间复制数据的需要,更有效地提供文件服务。
keepalive_timeout 65;
- 此设置决定了 Nginx 关闭连接之前,连接在空闲状态下应保持打开状态的时间(以秒为单位)。默认值为 65 秒。
现在让我们讨论一下文件中最重要的部分服务器块:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
server { ... }
- 该
server
块定义虚拟服务器的配置,即处理特定域或 IP 地址请求的服务器。
listen 80;
- 这告诉 Nginx 在端口 80 上监听 HTTP 请求。端口 80 是 HTTP 的默认端口。
server_name localhost;
- 该
server_name
指令指定此服务器块将响应的域名。localhost
通常用于本地测试,但在实际情况下,您可以将其替换为您的域名(例如example.com
)。
location / { ... }
- 该
location
块用于定义如何响应不同的请求 URI。这/
意味着该块将处理对根 URL(例如http://localhost/
)的请求。
root /usr/share/nginx/html;
- 该
root
指令指定 Nginx 应在哪个目录中查找要提供的文件。这里,它设置为/usr/share/nginx/html
,这是 Nginx 存储 HTML 文件的默认目录。
index index.html index.htm;
- 该
index
指令列出了 Nginx 在请求目录时应查找的文件。例如,如果用户导航到,Nginx 将尝试从根目录http://localhost/
提供index.html
或服务。index.htm
配置 Nginx
Nginx 安装完成后,会创建一个目录/etc/nginx/
,其中最重要的文件是nginx.conf
,它包含了 Nginx 的主要配置。
首先,让我们备份原文nginx.conf
:
mv /etc/nginx/nginx.conf /etc/nginx/nginx-backup.conf
nginx.conf
可以使用文本编辑器创建一个新文件,例如vim
:
vim /etc/nginx/nginx.conf
在此文件中,您将定义 Nginx 配置。这是一个简单示例:
events {
}
http {
server {
listen 80; listen 80 ;
server_name _ ; # 这意味着它将响应任何服务器名称
location / {
return 200 "Hello from Nginx Conf File" ;
}
}
}
编辑配置后,您需要重新加载 Nginx 以应用更改:
nginx -s reload
访问网站:打开浏览器并转到http://localhost:8080
。您应该看到“欢迎使用 Nginx”的消息。
让我们了解 NGINX 的一些最常用的块:
Nginx 使用各种块来构造其配置。最常见的三种是server
、location
和upstream
块。
Server
- 目的:定义特定域或 IP 地址的配置。
- 示例:上面的基本配置中已经涵盖。
Location
- 目的:定义如何响应特定的请求URI。
- 例子:
location /images/ {
root /var/www/images;
}
Upstream
- 目的:定义一组用于负载平衡的后端服务器。
- 例子:
upstream backend {
server backend1.example.com;example.com;
server backend2.example.com;
}
使用 Nginx 进行反向代理
反向代理位于客户端和后端服务器之间,将客户端请求转发到后端,并将后端的响应发送回客户端。以下是将 Nginx 配置为反向代理的方法:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;$host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
proxy_pass http://backend_server;
:这告诉 Nginx 将请求转发到后端服务器。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添加到X-Forwarded-For
Header中,以便后端识别原始客户端IP。
使用 Nginx 进行负载平衡
Nginx 可以将流量分配到多个后端服务器之间,以平衡负载。
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
upstream backend { ... }
:定义一组后端服务器。server backend1.example.com;
:将服务器添加到后端组。proxy_pass http://backend;
:将请求转发到后端组中的一台服务器。
使用 SSL/TLS 保护 Nginx
SSL/TLS 加密服务器和客户端之间的数据。以下是在 Nginx 中配置 SSL 的方法:
server {
listen 443 ssl;listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
location / {
root /var/www/html;
index index.html;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
listen 443 ssl;
:告诉 Nginx 在启用 SSL 的情况下监听端口 443(HTTPS 的默认端口)。ssl_certificate
和ssl_certificate_key
:指定您的 SSL 证书和私钥的路径。return 301 https://$host$request_uri;
:将所有 HTTP 请求重定向到 HTTPS。
高级 Nginx 配置
缓存
Nginx 可以缓存来自后端的响应,以加快后续请求的响应时间。
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
proxy_cache_path
:指定缓存的目录和设置。levels=1:2
:定义缓存的目录结构。keys_zone=my_cache:10m
:my_cache
创建一个名为10MB内存的共享内存区域。max_size=1g
:将缓存大小限制为 1GB。inactive=60m
:如果 60 分钟内没有访问过缓存项,则将其从缓存中删除。
监控和日志记录
Nginx 记录所有请求和错误,这对于故障排除和监控至关重要。
log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
log_format main ...
:定义一个名为的自定义日志格式main
。access_log /var/log/nginx/access.log main;
:使用日志格式将访问日志存储到指定的文件中main
。
常见错误
- 403 Forbidden:通常意味着 Nginx 无法访问请求的文件。
- 500 内部服务器错误:通常表示后端服务器出现问题或 Nginx 配置错误。
结论
Nginx 是一款功能强大且用途广泛的 Web 服务器,已成为现代 Web 基础架构的基石。它最初是 C10K 问题的解决方案(处理数千个并发连接),现已发展成为一种多功能工具,可以充当反向代理、负载平衡器甚至缓存服务器。它的轻量级架构加上高性能和可靠性,使 Nginx 成为世界上许多最大、流量最大的网站的首选。