Nginx 全面攻略:动静分离、压缩、缓存、黑白名单、跨域、高可用
bigegpt 2024-10-07 06:28 5 浏览
Nginx 作为一款高性能的 HTTP 服务器和反向代理服务器,被广泛应用于各类互联网项目中。它不仅能够提供静态文件服务,还支持动静分离、压缩、缓存、黑白名单、跨域、高可用等多种高级功能。本文将带你全面了解和掌握 Nginx 的这些强大功能。
一、动静分离
动静分离是指将动态请求与静态资源请求分离开来,使静态资源请求直接由 Nginx 处理,而动态请求则转发到后端应用服务器(如 Tomcat、Flask)。
server {
listen 80;
server_name www.example.com;
# 静态资源处理
location /static/ {
root /var/www/html;
}
# 动态请求转发
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
以上配置中,所有以 /static/ 开头的请求将由 Nginx 直接处理,其它请求将被转发到后端应用服务
二、压缩
启用 Gzip 压缩可以减少传输的数据量,提升网站加载速度。
http {
gzip on;
gzip_types text/plain application/json application/x-javascript text/css application/xml;
gzip_min_length 1000;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_vary on;
}
gzip_types 指定了需要压缩的 MIME 类型,gzip_comp_level 设置了压缩级别(1-9,数值越大压缩率越高但 CPU 负担越重)。
三、缓存
Nginx 支持多种缓存机制,可以对静态资源和动态内容进行缓存。
- 静态资源缓存
location /images/ {
expires 30d;
}
- 代理缓存
将动态请求的结果缓存,以减轻后端服务器的压力。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_pass http://127.0.0.1:8080;
}
}
四、黑白名单
通过配置黑白名单,可以控制访问 Nginx 的 IP 地址。
server {
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
deny all;
}
}
以上配置只允许 192.168.1.0/24 网段的 IP 访问,不允许其它 IP 访问。
五、跨域
跨域资源共享(CORS)允许网页请求其他域的资源。在 Nginx 中可以通过添加响应头来实现。
server {
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
if ($request_method = 'OPTIONS') {
return 204;
}
}
}
六、高可用
Nginx 自带的负载均衡和健康检查功能使其成为高可用架构的优秀选择。
- 负载均衡
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://backend;
}
}
- 健康检查
结合 ngx_http_upstream_check_module 模块(需要编译启用),可以实现健康检查。
upstream backend {
server backend1.example.com;
server backend2.example.com;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "GET /healthz HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx;
}
七、性能优化
通过优化配置参数,提升 Nginx 的性能和处理能力。
- 连接处理
worker_processes auto;
worker_connections 1024;
events {
use epoll;
worker_connections 2048;
}
- 静态文件处理
location / {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
}
- 缓冲区和时间参数优化
client_max_body_size 10m;
client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
以上参数合理设置,可以极大提升 Nginx 的处理能力和资源利用率。
通过以上策略和配置,你不仅可以掌握核心的 Nginx 功能,还能在实际项目中灵活运用这些技巧,实现从简单到复杂的部署需求。无论是静态资源管理、性能优化还是高可用架构,Nginx 都能为你提供可靠高效的解决方案。
希望这篇文章对你有所帮助,欢迎点赞、分享和讨论你的经验!
更多运维和架构技巧,关注我们,不错过每一篇精彩内容!?
相关推荐
- Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析
-
这篇文章是关于Dify「模板转换」节点的终极指南,解析了基于Jinja2模板引擎的动态文本生成技巧,涵盖多源文本整合、知识检索结构化、动态API构建及个性化内容生成等六大应用场景,助力开发者高效利用模...
- 我用C#造了个AI程序员:自动调试+重构代码实战
-
在软件开发的世界里,调试和重构代码往往占据了程序员大量的时间。我一直梦想着能有一个智能助手,帮我处理这些繁琐的工作。于是,我决定用C#打造一个AI程序员,让它具备自动调试和重构代码的能力。系统架构设计...
- 公文自动排版vba代码(公文自动排版vba代码)
-
Sub公文自动排版()'设置页面参数(单位:厘米)WithActiveDocument.PageSetup.TopMargin=CentimetersToPoints(3.7)...
- Anthropic最强代码神器:Claude Code系统提示词
-
最近,在融合Opus-4之后,ClaudeCode的整体能力直线飙升.甚至一度把曾经的最强开发工具——Cursor打的抬不起头来。无论是代码生成的准确度,还是智能补全的丝滑体验,都让人印象深...
- 使用 Ruff 进行 Python 代码格式化与静态检查
-
随着Python项目的规模增大,保持一致的代码风格和高质量的代码变得尤为重要。Ruff是一个现代、高性能、支持lint和格式化的Python工具,能帮助你快速发现并修复常见代码问题。本文...
- 基础语法篇:格式化输出 含完整示例代码
-
所谓格式化输出就是按照一定格式来输出对应的内容,在Python的语法中格式化输出包含两种:格式化符号、格式化字符串一、格式化符号常用的格式化符号包括%s(将内容转换为字符串,放入占位位置)、%d(将内...
- 代码整洁如诗!Keil 插件上线,一键格式化代码,告别风格混乱!
-
引言:代码格式不统一?你的团队还在为“括号位置”吵架吗?嵌入式开发者们,你是否经历过这些抓狂瞬间?代码风格“百花齐放”:同事的代码缩进用空格,你的用Tab,合并时冲突频发!手动调整耗时费力:为了通过C...
- [信捷PLC] 信捷PLC之C函数编程(一)
-
前言写PLC程序,越来越觉得结构化文本编程语言(ST)给PC编程带来的便利,在处理一些数据上,可以写的更加灵活。所以,在项目PLC选型上,我都会优先选择支持结构化文本的PLC。国内有些厂商推出了一些较...
- C语言-HelloWorld解析(c语言的helloworld怎么写)
-
使用VisualStudio2017开发工具新创建一个项目,编写第一个C语言程序。#include<stdio.h>voidmain(){printf("HelloW...
- VSCode 配置 C++ 开发环境!教程详解
-
第一步、安装VSCode应用程序打开VSCode官网,下载对应安装包并默认安装(这里指明:安装路径可以修改)第二步、安装相关插件此时的VSCode仅仅是一个英文文本编辑器,还称不上开发工具,所以需要...
- C语言进阶教程:C语言与汇编语言交互
-
C语言和汇编语言的交互是底层编程和性能优化中的一个重要方面。理解它们如何协同工作,可以帮助开发者更好地控制硬件、优化关键代码段以及理解编译器的行为。为什么需要在C语言中嵌入汇编?尽管C语言已经提供了相...
- C语言如何处理平台相关代码(c语言的开发平台)
-
在进行跨平台C编程时,不可避免地会遇到需要针对不同操作系统或硬件架构编写特定代码的情况。C语言通过预处理器指令,特别是条件编译指令,为我们提供了处理平台相关代码的有效机制。最常用的就是利用预定义的宏(...
- C语言:hello world(c语言helloworld代码)
-
环境:a.初学者建议用“啊哈C”,这款软件简单易装;b.devc.visualstdiod.Vc6.0第一行代码:#include<stdio.h>#<stdio.h&g...
- C语言之编译器集合(编写c语言编译器)
-
C语言有多种不同的编译器,以下是常见的编译工具及其特点:一、主流C语言编译器1.GCC(GNUCompilerCollection)特点:开源、跨平台,支持多种语言(C、C++、Fortran...
- 适合零基础初学者学习C语言第一课教程,揭开C语言的神秘面纱
-
一、C语言简介我刚接触编程,首先想要学习的就是C语言,这次我就把我的感悟用我自己理解的文字表述出来,这样对刚学C语言的人来说,才是比较友好的。因为我们都没有C语言的基础,不懂啥是编程,啥事代码。我们...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)