深入浅出 Nginx 配置——从入门到精通

360影视 2025-01-07 16:44 3

摘要:Nginx以其轻量级、稳定性和高效的并发处理能力而闻名。自发布以来,Nginx 已经成为全球众多 Web 站点和应用程序不可或缺的一部分。

号主:老杨丨11年资深网络工程师,更多网工提升干货,

下午好,我的网工朋友。

Nginx以其轻量级、稳定性和高效的并发处理能力而闻名。自发布以来,Nginx 已经成为全球众多 Web 站点和应用程序不可或缺的一部分。

随着互联网技术的快速发展,越来越多的企业和个人开发者选择 Nginx 来构建和管理他们的 Web 基础设施。

无论是小型个人博客还是大型电子商务平台,Nginx 都提供了强大的功能和灵活性,帮助用户实现更好的性能和更高的可用性。

今天咱就来聊聊这个小东西,顺便带大家从入门到精通,先码后看

今日文章阅读福利:《 Nginx-1.26 版本》

资源一样给到你,而且已经给大家完成编译,解压即可直接使用。私信发送暗号“1.26”,即可获取此份优质资源。

Nginx是一个高性能的 HTTP 和反向代理服务器,同时也支持 IMAP/POP3 邮件代理功能。它以其轻量级、高并发处理能力和稳定性而著称。

Nginx 由俄罗斯程序员 Igor Sysoev 于 2004 年首次发布,并迅速成为全球最受欢迎的 Web 服务器之一。其开源版本和商业版 NGINX Plus 均广泛应用于各种规模的企业和项目中。

01 特点概述

高效的并发处理:使用异步非阻塞 I/O 模型,能够同时处理数千个并发连接,极大地提高了 Web 服务的响应速度。

轻量级:相比其他 Web 服务器,Nginx 占用的系统资源较少,运行效率更高。

模块化设计:通过加载不同的模块扩展功能,如 SSL/TLS 支持、压缩、缓存等,满足多样化需求。

反向代理和负载均衡:可以作为反向代理服务器将客户端请求转发给后端应用服务器,并提供简单的负载均衡功能以分散流量压力。

静态文件服务:快速高效地分发静态文件(HTML、CSS、JavaScript 等),减少应用程序服务器的负担。

灵活的配置语法:基于文本的配置文件易于理解和修改,支持丰富的配置选项,便于定制化部署。

Nginx 不仅是一个强大的 Web 服务器,还可以与其他工具和技术结合使用,构建复杂的网络基础设施。

例如,它可以与 FastCGI、uWSGI 或 gRPC 协议配合工作,支持 PHP、Python、Ruby 等多种编程语言的应用程序;也可以集成到 Kubernetes、Docker Swarm 等容器编排平台中,实现自动化的服务发现和流量管理。02 常用配置示例

01 配置静态文件服务器

创建目录并放置静态文件

假设我们有一个简单的 HTML 文件 index.html 和一些静态资源(如 CSS 和图片),这些文件位于 /var/www/html 目录下。

sudo mkdir -p /var/www/htmlsudo echo "

Hello, Nginx!

" > /var/www/html/index.html

配置 Nginx

编辑 Nginx 的默认配置文件或创建一个新的配置文件(例如 /etc/nginx/sites-available/static-site),添加以下内容:

server { listen 80; server_name your_domain_or_IP; root /var/www/html; index index.html; location / { try_files $uri $uri/ =404; } location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires max; log_not_found off; }}listen 80;:监听 HTTP 端口 80。server_name:指定服务器名称或 IP 地址。root:定义静态文件的根目录。index:设置默认索引文件。location /:处理所有请求,尝试匹配文件路径;如果找不到则返回 404 错误。*location ~ .(jpg|jpeg|png|gif|ico|css|js)$**:对特定类型的静态文件启用缓存,并禁用未找到文件的日志记录。

启用配置并重启 Nginx

确保配置文件正确无误后,启用站点配置并重新加载 Nginx:

sudo ln -s /etc/nginx/sites-available/static-site /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl reload nginx

现在,访问您的域名或 IP 地址应该可以看到静态页面,并且静态资源会被高效地提供给客户端。

02 配置反向代理

后端应用服务器

假设您有一个运行在 http://localhost:3000 上的 Node.js 应用程序。

配置 Nginx

编辑 Nginx 的默认配置文件或创建一个新的配置文件(例如 /etc/nginx/sites-available/reverse-proxy),添加以下内容:

server { listen 80; server_name your_domain_or_IP; location / { proxy_pass http://localhost:3000; 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; }}proxy_pass:指定后端应用服务器的地址。proxy_set_header:传递原始请求头信息给后端服务器,以便应用程序能够正确处理请求。

启用配置并重启 Nginx

同样地,启用站点配置并重新加载 Nginx:

sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl reload nginx

现在,所有发送到 Nginx 的请求都会被透明地转发给后端应用程序服务器,而客户端只会看到 Nginx 提供的统一接口。

03 配置负载均衡

后端服务器列表

假设您有三台后端服务器分别运行在 http://backend1:3000、http://backend2:3000 和 http://backend3:3000。

配置 Nginx

编辑 Nginx 的默认配置文件或创建一个新的配置文件(例如 /etc/nginx/sites-available/load-balancer),添加以下内容:

upstream backend_servers { server backend1:3000; server backend2:3000; server backend3:3000;}server { listen 80; server_name your_domain_or_IP; 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; }}upstream:定义一组后端服务器,Nginx 会自动选择其中一台来处理每个请求,默认采用轮询算法。其他配置项:与之前的反向代理配置相同,用于传递请求头信息。

启用配置并重启 Nginx

启用站点配置并重新加载 Nginx:

sudo ln -s /etc/nginx/sites-available/load-balancer /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl reload nginx

现在,Nginx 将根据配置的负载均衡策略将流量分散到不同的后端服务器上,从而提高了系统的可靠性和响应速度。

03 高级配置技巧

在掌握了 Nginx 的基本配置之后,了解一些高级配置技巧可以帮助您进一步优化性能、增强安全性和实现更复杂的功能。本节将详细介绍 SSL/TLS 配置、内容缓存和安全加固等高级配置方法。

01 SSL/TLS 配置

启用 HTTPS 是确保 Web 应用程序安全的关键步骤。通过 SSL/TLS 加密传输的数据可以保护用户信息免受中间人攻击和其他安全威胁。以下是配置 Nginx 支持 HTTPS 的步骤:

获取 SSL 证书

您可以从 Let's Encrypt 等免费证书颁发机构(CA)获取 SSL 证书,或者购买商业证书。以 Let's Encrypt 为例:

sudo apt install certbot python3-certbot-nginx # 对于 Debian/Ubuntusudo yum install certbot python3-certbot-nginx # 对于 CentOS/RHELsudo certbot --nginx -d your_domain_or_IP

Certbot 会自动完成证书申请和配置过程,并修改 Nginx 配置文件以启用 HTTPS。

手动配置 SSL

如果您已经拥有 SSL 证书,可以通过编辑 Nginx 配置文件手动启用 HTTPS:

server { listen 80; server_name your_domain_or_IP; # 重定向 HTTP 请求到 HTTPS return 301 https://$host$request_uri;}server { listen 443 ssl; server_name your_domain_or_IP; ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; 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; }}listen 443 ssl;:监听 HTTPS 端口 443。ssl_certificate 和 ssl_certificate_key:指定 SSL 证书和私钥路径。ssl_protocols 和 ssl_ciphers:设置支持的 SSL 协议版本和加密套件,确保使用强加密算法。

自动更新证书

对于 Let's Encrypt 证书,建议定期自动更新以避免过期。可以通过 cron 任务来实现:

# 编辑 crontab 文件crontab -e# 添加以下行以每天凌晨 2 点检查并更新证书0 2 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx

02 内容缓存

启用缓存可以显著提高 Web 应用程序的响应速度,减少服务器负载。Nginx 提供了灵活的内容缓存机制,可以根据需要进行配置。

配置缓存区

首先,在 http 块中定义一个或多个缓存区:

http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;}10.212.4.107 0011-43a3-388f 0 D-0 Eth4/0/42proxy_cache_path:定义缓存存储路径、层级结构、键空间名称、最大大小和失效时间等参数。

配置缓存规则

接下来,在 server 或 location 块中应用缓存规则:

server { listen 80; server_name your_domain_or_IP; 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; proxy_cache my_cache; proxy_cache_valid 200 301 302 10m; proxy_cache_valid 404 1m; add_header X-Proxy-Cache $upstream_cache_status; }}proxy_cache:指定使用的缓存区名称。proxy_cache_valid:根据响应状态码设置不同的缓存有效期。add_header:添加自定义头信息,显示缓存状态(如 HIT、MISS)。

03 安全加固

增强 Nginx 的安全性是保护 Web 应用程序免受潜在威胁的重要措施。以下是几个常用的安全配置技巧:

限制 HTTP 方法

仅允许必要的 HTTP 方法(如 GET、POST),禁止其他不常用的方法(如 DELETE、PUT):

if ($request_method !~ ^(GET|POST)$ ) { return 405;}

防止点击劫持

通过设置 X-Frame-Options 头信息来防止页面被嵌入到其他网站的 iframe 中:

add_header X-Frame-Options SAMEORIGIN;

防止 MIME 类型嗅探

禁用浏览器的 MIME 类型嗅探功能,防止某些类型的攻击:

add_header X-Content-Type-Options nosniff;

启用严格传输安全(HSTS)

强制浏览器只通过 HTTPS 访问您的站点,并在一段时间内记住这个设置:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

限制上传文件大小

根据应用程序需求设置合理的上传文件大小限制,防止恶意上传大文件导致服务器资源耗尽:

client_max_body_size 10M;

启用安全标头

综合使用多种安全标头来提升整体安全性:

add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';";add_header Referrer-Policy "no-referrer-when-downgrade";add_header Permissions-Policy "geolocation=, microphone=";04 常见问题及解决方法

01 配置文件语法错误

启动或重新加载 Nginx 时失败,并报告配置文件中有语法错误。

解决方法:使用 nginx -t 检查配置文件语法是否正确。该命令会验证配置文件并在发现问题时提供具体的错误信息。修复错误后重新加载 Nginx。

sudo nginx -tsudo systemctl reload nginx

02 端口冲突

Nginx 启动失败,提示端口已被占用。

解决方法:检查是否有其他服务正在使用相同端口(如 Apache)。可以使用 netstat 或 ss 命令查看端口占用情况,并调整 Nginx 或其他服务的监听端口。

sudo netstat -tuln | grep :80sudo ss -tuln | grep :80

03 反向代理超时

访问反向代理后的应用程序时出现 504 Gateway Time-out 错误。

解决方法:增加 proxy_read_timeout 和 proxy_connect_timeout 的值以允许更长的处理时间。例如:

location / { proxy_pass http://backend_servers; proxy_read_timeout 300s; proxy_connect_timeout 300s;}

04 SSL/TLS 握手失败

客户端无法建立 HTTPS 连接,提示 SSL/TLS 握手失败。

解决方法:确保 SSL 证书有效且未过期;检查 ssl_protocols 和 ssl_ciphers 设置是否兼容客户端浏览器。使用在线工具(如 SSL Labs)测试 SSL 配置并根据建议进行调整。

05 日志分析

遇到不明原因的问题,难以定位具体原因。

解决方法:启用详细的错误日志级别 (error_log) 并结合访问日志 (access_log) 分析请求模式。使用工具如 grep、awk 和 sed 来过滤和解析日志文件。

error_log /var/log/nginx/error.log debug;

来源:网络工程师俱乐部

相关推荐