NGINX 的功能是什么?NGINX 是一款开源软件,旨在快速处理大量并发连接。它管理从静态文件传输到繁忙网站的负载均衡等所有事务。许多人将其称为 NGINX Web 服务器,但它也可以用作 NGINX 反向代理,当您需要保护后端服务免受直接公共访问时,此功能非常方便。
Apache 一直是 Web 托管的传统选择,但它以更注重流程驱动的方式处理请求。这种方式在流量激增时可能会变得负担过重。相比之下,NGINX 采用事件驱动的设计,能够以更少的资源服务更多客户端。这通常可以带来更高的性能和更低的内存占用。
您会发现它被小型企业、大型品牌以及运营流媒体服务的人士广泛使用。为什么?因为它非常灵活。例如,您可以将 SSL 处理任务交给 NGINX,并将未加密的流量传递到后端服务器。您还可以在后台将传入的请求分发到多个服务器。
本质上,NGINX 是什么?它是一个能够处理大规模并发、高效提供静态文件并顺利管理复杂工作负载的引擎。
NGINX 指令
NGINX 依靠指令来完成其工作。每个指令就像一条指示服务器如何运行的指令。您通常可以在 NGINX 配置文件中找到它们,在/etc/nginx/nginx.conf许多 Linux 发行版中通常位于。具体位置可能因您的发行版(Ubuntu、CentOS、Arch Linux 等)和安装方法而异。指令看起来像directive_name value;并且始终以分号结尾。
您将在不同的上下文中看到 NGINX 配置指令。有些指令位于主(全局)作用域中,该作用域适用于整个服务器。其他指令则位于http块、server块或location块中。一些 NGINX 全局指令定义用户权限或工作进程,从而为您提供一个大致的框架。以下是一个小示例:
user nginx;
worker_processes auto;
pid /run/nginx.pid;
这些行阐明了谁在运行 NGINX、应该启动多少个工作进程以及 PID 文件的存储位置。在这些行下方,您通常会看到http { ... }HTTP 相关的设置。
在 中http,您可以添加用于压缩、缓存或日志记录的指令。然后,您将拥有用于特定于域或特定于路径的指令的服务器和位置块。嵌套很重要。如果您在http块中放置了某些内容,则除非在较低级别被覆盖,否则它将被所有服务器块共享。跟踪此层次结构将有助于您组织文件并减少错误。
HTTP 块
在大多数设置中,NGINX HTTP 块存在于主文件nginx.conf或通过语句引入的文件中include。此块决定了在服务器或位置块细化细节之前如何处理 HTTP 流量。
本节中的典型指令可能会设置默认内容类型、管理连接超时或启用文件压缩。例如:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
}
这里,include mime.types;帮助 NGINX 识别文件类型(例如.html和.css)。该sendfile on;指令使用基于操作系统的机制来简化文件传输。如果您想启用 gzip,也需要在此处启用。
可以将其想象成一个广阔的画布。HTTP 块中定义的任何设置都会全局生效,除非更深层的块或指令覆盖它。
服务器块
如果您计划在单个 NGINX 实例上托管多个站点,那么 NGINX 服务器块将是您的好帮手。每个服务器块定义了特定站点或域名的行为方式。简单来说,服务器块可能如下所示:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
在这里,您可以指定端口 ( listen 80;) 和域名。您还可以决定网站文件的存放位置。这通常称为“虚拟托管”。您可以将多个服务器块放在一个文件中,也可以将它们拆分到 NGINX 包含的单独文件中。更改未显示?请参阅常见问题解答以获取提示。
SSL?没问题。只需listen 443 ssl;在同一个块内使用您的证书和密钥设置即可。您还可以为不同的 URL 设置位置块,让您可以微调网站的结构。例如,您可以将请求转发到 的后端应用程序,同时/api/在 下提供静态文件/。
服务器块将每个站点整齐地包含在内,从而可以直接在同一个物理或虚拟服务器上管理多个域。
位置区块
在服务器块中,NGINX 位置块详细说明了如何处理某些路径或文件模式。您可以使用它们来提供图像、将 PHP 请求转发到 FastCGI 进程,甚至拒绝访问隐藏文件。例如:
location /images/ {
alias /var/data/images/;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include fastcgi_params;
}
第一个位置将下面的所有内容移交/images/给 目录/var/data/images/。第二个位置使用正则表达式 ( ~ \.php$) 来匹配.php文件并将它们传递给 PHP-FPM 套接字。
NGINX 对位置块使用优先级系统。精确匹配(例如location = /hello.html)优先于更通用的匹配。如果使用正确的标志指定,基于正则表达式的匹配也可以覆盖。如果您必须调整子路径的行为,嵌套位置可以让您进行更深入的操作。
NGINX 在匹配位置块时遵循特定的顺序:
完全匹配 (=):location = /path
优先前缀匹配(^~):location ^~ /path
正则表达式匹配(~,~*):location ~ \.php$
前缀匹配:location /path
NGINX 首先检查是否存在精确匹配。如果不存在,它会记住最长前缀匹配,然后检查正则表达式匹配。如果正则表达式匹配,NGINX 会使用该位置;否则,它会使用已存储的前缀匹配。了解此优先级系统有助于防止配置中出现意外行为。
不确定哪个位置块生效了?您可以运行nginx -T,然后扫描您的域名和路径,以检查整体配置。此外,nginx -t在重新加载之前,请考虑使用 来确认语法正确。
使用位置根和索引
root有时你会看到带有或 的NGINX location 命令alias。这会告诉 NGINX 在哪里查找实际文件。例如:
location / {
root /var/www/mywebsite;
index index.html index.htm;
}
当有人访问您的域名时,NGINX 会查找/var/www/mywebsite或index.html。index.htm如果两者都不存在,您可以设置自定义错误页面或依赖默认的 404.
alias与 略有不同root。使用 时alias,您指定的路径将替换整个请求路径。使用 时root,NGINX 会将请求 URI 附加到目录路径。如果您仔细规划,这两种方法都可以。只需确保您了解文件的排列方式,以便请求能够正确映射到底层文件系统。
这种简单的安排可以帮助您避免麻烦。如果您遇到意外的 404 错误,请仔细检查您使用的指令,并确保文件路径与实际情况相符。有关更多信息,请参阅常见问题解答。
监听端口
默认情况下,NGINX 监听 HTTP 端口 80 和 HTTPS 端口 443.这由 NGINX listen 指令定义。例如:
server {
listen 80;
server_name mysite.org;
...
}
您还可以启用多个 NGINX 监听端口:
listen 80;
listen 8080;
如果您有多个网络接口,则可以使用以下命令指定 IP:
listen 192.168.1.10:80;
请记住调整防火墙规则,以免阻止这些端口的流量。这样,无论访问者使用哪个端口,他们都可以访问您的内容。
Server_name 指令
NGINX 服务器名称指令告诉服务器块应该处理哪些域或子域:
server_name example.org www.example.org;
此块将响应任一域的请求。还允许使用通配符:
server_name *.example.net;
匹配任意子域名。你甚至可以更高级地使用正则表达式,尽管这种方法不太常见。例如:
server_name ~^(?.+)\.example\.com$;
保持设置清晰。如果您有多个子域,通配符通常会简化事情。始终确认 DNS 设置将流量定向到您的服务器的 IP 地址。
NGINX 反向代理
NGINX 反向代理的工作原理是接收流量并将其传递给另一项服务。这可以减少后端应用程序的直接暴露,并让 NGINX 处理 SSL 或速率限制。基本的 NGINX 反向代理配置可能如下所示:
server {
listen 80;
server_name proxydemo.com;
location / {
proxy_pass http://127.0.0.1:4000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
在此 NGINX 反向代理示例中,传入的流量proxydemo.com被转发到http://127.0.0.1:4000/。额外的标头可帮助目标应用程序查看原始主机和 IP 地址。如果需要负载平衡,可以定义多个服务器:
upstream myapp {
upstream myapp {
server 192.168.1.50:4000;
server 192.168.1.51:4000;
}
server {
listen 80;
server_name balancedsite.com;
location / {
proxy_pass http://myapp;
}
}
设置负载平衡时,请记住将所有 keepalive 指令放在负载平衡算法之后:
upstream myapp {
server 192.168.1.50:4000;
server 192.168.1.51:4000;
least_conn; # Load balancing algorithm
keepalive 32; # Keepalive connections
}
此 NGINX 反向代理设置将请求分发到 列出的服务器upstream,从而提高性能和可用性。这是一种无需重写核心应用程序即可轻松处理扩展的方法。
NGINX 配置常见问题解答
为什么我的更改没有显示出来?
NGINX 仅在启动时或重新加载后加载其配置。因此,编辑后,请运行sudo systemctl reload nginx或sudo nginx -s reload。
如何查看我的 NGINX 配置是否有效?
用于nginx -t测试 NGINX 配置错误。如果出现错误,它会精确定位到文件和行号。
为什么我的静态文件会返回 404?
请检查你的root路径alias。位置块和目录之间的一个拼写错误或不匹配都可能导致文件丢失。
如何提升速度?
开启sendfile,尝试gzip on;压缩,并设置合理的超时时间。对于大流量,可以考虑使用负载均衡或缓存层。
我可以在不冒停机风险的情况下进行测试吗?
最好有一个临时环境。如果无法做到这一点,请逐步应用更改并密切关注日志。这样,您就可以快速发现任何问题。