• [行业前沿] 从 Nginx 到云原生服务网格的演进
     在微服务架构普及的今天,单体应用被拆分为数十甚至上百个独立服务,每个服务暴露自己的 API。这种解耦带来了开发敏捷性,却也引入了新的复杂性:如何统一管理入口流量、保障安全、实现可观测性并简化客户端调用? API 网关(API Gateway)应运而生,作为系统的“前门”,承担起路由、认证、限流、日志等横切关注点。然而,随着云原生、Service Mesh 和 Serverless 的兴起,API 网关的角色正在发生深刻变化。一、API 网关的核心职责一个成熟的 API 网关通常需提供以下能力:请求路由(Routing)根据路径、Host、Header 等将请求转发至对应后端服务。认证与鉴权(Authentication & Authorization)验证 JWT、OAuth Token、API Key,并校验权限。限流与熔断(Rate Limiting & Circuit Breaking)防止突发流量压垮后端,保障系统稳定性。协议转换(Protocol Translation)如将 gRPC 转为 REST,或将 WebSocket 代理至后端。可观测性(Observability)记录访问日志、生成指标(QPS、延迟)、集成分布式追踪。安全防护(Security)防御 DDoS、注入攻击、爬虫等,支持 WAF(Web Application Firewall)。开发者体验(Developer Experience)提供 API 文档(Swagger/OpenAPI)、测试沙箱、订阅管理。二、演进阶段一:基于 Nginx 的静态网关(2010–2016)早期团队常直接使用 Nginx 作为简易网关:server { listen 80; server_name api.example.com; location /users/ { proxy_pass http://user-service; } location /orders/ { proxy_pass http://order-service; } # 简单限流 limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;}优势:性能极高(C 编写,事件驱动)配置灵活,社区模块丰富(如 lua-nginx-module)局限:配置静态化:新增服务需手动改配置并 reload无动态控制面:无法通过 API 实时调整路由或策略缺乏原生认证/限流:需依赖 Lua 脚本(OpenResty)扩展三、演进阶段二:专用 API 网关崛起(2016–2020)为解决动态管理问题,专用网关产品涌现:1. Kong(基于 OpenResty)插件化架构:官方提供 100+ 插件(JWT、OAuth2、Prometheus)Admin API:可通过 HTTP API 动态管理路由数据库支持:PostgreSQL/Cassandra 存储配置企业版支持:Vitals(监控)、Dev Portal(开发者门户)2. Tyk开源 + 商业双模式内置 OAuth2 授权服务器支持 GraphQL 聚合3. Amazon API Gateway / Azure API Management托管服务,免运维深度集成云生态(Lambda、IAM、CloudWatch)架构特点:控制面 + 数据面分离控制面(Admin API + DB)管理配置,数据面(Nginx/OpenResty)处理流量动态重载:无需重启即可生效新策略⚠️ 痛点:插件性能损耗(Lua VM 开销)多语言插件开发困难与 Kubernetes 原生集成弱四、演进阶段三:云原生网关(2020–至今)Kubernetes 成为主流部署平台后,网关需深度适配声明式 API 和服务发现。1. Ingress Controller ≠ API 网关?Ingress(如 Nginx Ingress)仅提供 L7 路由,缺乏认证、限流等高级功能API 网关需在此基础上增强2. 云原生网关代表Ambassador (Emissary-ingress)基于 Envoy Proxy使用 Kubernetes CRD(如 Mapping)定义路由原生支持 gRPC、WebSocket、OIDCGloo Gateway支持多协议(REST/gRPC/WebSocket)可聚合多个后端为单一 GraphQL 端点与 Istio 兼容Apache APISIX高性能(基于 etcd + Nginx)动态路由毫秒级生效支持 Serverless(对接 AWS Lambda、OpenFunction)核心优势:GitOps 友好:配置即 YAML,纳入版本控制自动服务发现:监听 K8s Endpoints,动态更新 upstream多租户隔离:按 Namespace 或 Label 分组管理 API 网关的演进,映射了整个后端架构的变迁:从静态配置到动态治理,从单体代理到云原生控制面,从单纯路由到全生命周期 API 管理。今天的 API 网关,早已不是简单的“反向代理”,而是连接外部世界与内部服务的智能枢纽。在微服务、Serverless 与服务网格并存的混合架构中,理解网关的定位与能力边界,是构建高可用、安全、可扩展系统的关键一步。未来,随着协议多样化和边缘计算兴起,API 网关将继续进化,成为数字世界的“通用翻译官”与“智能守门人”。
  • [技术干货] 理解 Nginx 中的 location 配置
     Nginx 是一款高性能的 Web 服务器和反向代理服务器,其配置灵活、性能卓越,被广泛应用于现代 Web 架构中。在 Nginx 的配置文件中,location 指令是实现请求路由的核心机制之一。正确理解和使用 location,对于构建高效、安全、可维护的服务至关重要。一、location 基本语法location 指令用于定义如何处理特定 URI(统一资源标识符)的请求。其基本语法如下:location [modifier] pattern { # 配置指令}其中:modifier 是可选的修饰符,用于指定匹配方式;pattern 是要匹配的 URI 路径或正则表达式;{} 内是具体的配置指令,如 proxy_pass、root、rewrite 等。二、location 的五种匹配类型Nginx 支持以下五种主要的 location 匹配类型,每种有不同的优先级和用途:1. 精确匹配(=)location = /index.html { ...}特点:完全匹配 URI,不进行任何前缀或正则扩展。优先级最高。适用于高频访问且路径固定的资源(如首页),能提升性能。示例:当请求为 /index.html 时匹配,但 /index.html?a=1 也会匹配(Nginx 在匹配时忽略查询字符串)。2. 前缀匹配(无修饰符)location /images/ { ...}特点:匹配以指定字符串开头的 URI。属于“普通前缀匹配”,优先级低于 = 和 ^~。可被正则匹配覆盖(除非使用 ^~)。3. 最长前缀匹配(^~)location ^~ /static/ { ...}特点:也是前缀匹配,但一旦匹配成功,不再检查正则 location。优先级高于普通前缀匹配,但低于 =。适用于静态资源目录,避免不必要的正则计算。4. 正则匹配(~ 和 ~*)location ~ \.php$ { ...}location ~* \.(jpg|jpeg|png)$ { ...}~:区分大小写的正则匹配;~*:不区分大小写的正则匹配。按配置文件中出现的顺序依次匹配,一旦匹配成功即停止。优先级高于普通前缀匹配,但低于 = 和 ^~。5. 通用匹配(/)location / { ...}匹配所有请求,通常作为兜底规则。优先级最低。三、location 匹配优先级总结Nginx 处理请求时,location 的匹配顺序如下:精确匹配(=)最长前缀匹配(^~)正则匹配(~ / ~*) —— 按配置顺序普通前缀匹配 —— 选择最长匹配的规则通用匹配(/) 注意:普通前缀匹配虽然先被扫描,但只有在没有更高优先级规则匹配时才会生效。Nginx 会先找出所有前缀匹配中最长的一个,然后判断是否有 ^~ 或 =,如果没有,则继续尝试正则匹配。四、示例示例 1:静态资源与动态请求分离server { listen 80; server_name example.com; # 精确匹配首页 location = / { root /var/www/html; index index.html; } # 静态资源,使用 ^~ 避免正则检查 location ^~ /static/ { alias /var/www/static/; expires 30d; } # PHP 动态请求 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; } # 兜底规则 location / { try_files $uri $uri/ /index.html; }}示例 2:API 路由代理location /api/v1/ { proxy_pass http://backend_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;}注意:proxy_pass 结尾是否带 / 会影响 URI 重写行为。proxy_pass http://backend/; → /api/v1/user → 后端收到 /userproxy_pass http://backend; → /api/v1/user → 后端收到 /api/v1/user 掌握 Nginx 的 location 匹配机制,是构建高性能 Web 服务的基础。理解其优先级规则、合理使用修饰符、结合实际业务场景设计路由逻辑,不仅能提升系统性能,还能增强安全性和可维护性。 
  • [技术干货] Lua 脚本语言深度解析
    在众多编程语言中,Lua(发音为 /ˈluːə/,意为“月亮”)以其轻量、高效、可嵌入性强的特性,在游戏开发、嵌入式系统、Web 服务器扩展、脚本自动化等领域占据着不可替代的地位。它被广泛应用于 《魔兽世界》、《愤怒的小鸟》、Redis、Nginx (OpenResty) 等知名项目中。 什么是 Lua?Lua 是一种用标准 C 语言编写的开源、轻量级、可扩展的脚本语言,由巴西里约热内卢天主教大学(PUC-Rio)的 Roberto Ierusalimschy 等人于 1993 年开发。核心设计理念:轻量:整个解释器核心仅几百 KB,适合嵌入资源受限的设备。高效:执行速度快,接近 Python、JavaScript 等主流脚本语言。可嵌入:设计初衷就是作为“胶水语言”,无缝集成到 C/C++ 等宿主程序中。可扩展:通过 C 扩展模块,轻松调用底层功能。定位:Lua 不是用于构建大型独立应用的“主语言”,而是作为嵌入式脚本语言,为宿主程序提供灵活的逻辑扩展能力。Lua 的核心特性特性说明轻量级解释器体积小(~200KB),内存占用低速度快基于寄存器的虚拟机,执行效率高动态类型变量无需声明类型,运行时确定自动内存管理内置垃圾回收(GC)机制过程式 + 函数式支持函数式编程(函数是一等公民)协程(Coroutine)轻量级线程,支持协作式多任务无内置复杂类型仅提供 表(table) 作为唯一数据结构,但功能强大Lua 基础语法速览1. 变量与数据类型Lua 有 8 种基本类型:nil, boolean, number, string, function, thread, table, userdata。-- 变量声明(无需类型)name = "Alice" -- stringage = 25 -- numberis_active = true -- booleanscore = nil -- nil-- 动态类型x = 10x = "hello" -- 合法,类型在运行时改变2. 表(Table)—— Lua 的“瑞士军刀”table 是 Lua 中唯一的数据结构,可实现数组、字典、对象、模块等多种功能。-- 作为数组(索引从 1 开始!)fruits = {"apple", "banana", "orange"}print(fruits[1]) --> "apple"-- 作为字典(键值对)person = { name = "Bob", age = 30, city = "Shanghai"}print(person["name"]) --> "Bob"print(person.age) --> 30-- 混合使用mixed = {10, "hello", x = 1, y = 2}print(mixed[1]) --> 10print(mixed.x) --> 13. 控制结构-- if 语句if age > 18 then print("Adult")elseif age > 13 then print("Teen")else print("Child")end-- for 循环for i = 1, 5 do print(i)end-- while 循环local i = 1while i <= 3 do print(i) i = i + 1end4. 函数(Function)函数是“一等公民”,可赋值给变量、作为参数传递。-- 定义函数function greet(name) return "Hello, " .. name .. "!"end-- 调用print(greet("Alice")) --> "Hello, Alice!"-- 函数作为变量local sayHi = function(name) return "Hi, " .. nameend-- 闭包(Closure)function makeCounter() local count = 0 return function() count = count + 1 return count endendcounter = makeCounter()print(counter()) --> 1print(counter()) --> 2Lua 的核心优势:可嵌入性Lua 的最大价值在于它可以被轻松嵌入到 C/C++ 程序中,通过 Lua C API 实现双向调用。典型嵌入流程:宿主程序(C/C++) 调用 Lua 脚本。Lua 脚本 调用宿主程序暴露的 C 函数。数据交换:通过 Lua 栈(Stack)传递参数和返回值。C 代码调用 Lua 示例:#include <lua.h>#include <lualib.h>#include <lauxlib.h>int main() { lua_State *L = luaL_newstate(); // 创建 Lua 状态机 luaL_openlibs(L); // 加载标准库 // 执行 Lua 脚本 if (luaL_dofile(L, "script.lua") != 0) { fprintf(stderr, "Error: %s\n", lua_tostring(L, -1)); } lua_close(L); return 0;}Lua 调用 C 函数:C 代码注册函数后,Lua 脚本可直接调用:-- Lua 脚本中result = my_c_function(42, "hello")Lua 的典型应用场景1. 游戏开发《魔兽世界》:UI 界面和插件系统使用 Lua。《愤怒的小鸟》:游戏逻辑由 Lua 驱动。Cocos2d-x:跨平台游戏引擎,支持 Lua 脚本开发。✅ 优势:热更新、快速迭代、非程序员(策划、美术)也能参与逻辑编写。2. Web 服务器扩展OpenResty:基于 Nginx 和 Lua 的高性能 Web 平台。在 Nginx 中直接运行 Lua 脚本,实现 API 网关、限流、鉴权、缓存等。性能远超传统 PHP/Python 后端。location /api { content_by_lua_block { local redis = require("resty.redis") local red = redis:new() red:connect("127.0.0.1", 6379) local data = red:get("user:123") ngx.say(data) }}3. 数据库脚本Redis:使用 Lua 脚本实现原子性操作(EVAL 命令)。多条命令打包执行,避免网络开销。保证操作的原子性。-- Redis Lua 脚本:原子性递增并返回local current = redis.call("GET", KEYS[1])if current then current = tonumber(current) + 1 redis.call("SET", KEYS[1], current) return currentelse return nilend4. 嵌入式系统与 IoT资源受限设备(如路由器、智能家居)中,Lua 用于配置脚本、业务逻辑扩展。NodeMCU:基于 ESP8266 的 IoT 固件,支持 Lua 编程。5. 配置与自动化脚本作为配置文件语言(比 JSON 更灵活)。自动化工具脚本(如 Wireshark 的插件)。  Lua 虽然小众,但其在特定领域的不可替代性使其历久弥新。它证明了“少即是多”的设计哲学——一个简单的 table 和强大的 C API,足以支撑起无数复杂系统的灵活扩展。
  • [技术干货] 高性能 Web 服务器与反向代理实战
    Nginx(发音为 "engine-x")已成为高并发、高性能 Web 服务的代名词。作为全球最受欢迎的 Web 服务器之一,Nginx 不仅被 Google、Facebook、Netflix、淘宝、京东等大型互联网公司广泛采用,更是微服务、负载均衡、API 网关等现代架构的核心组件。 一、什么是 Nginx?Nginx 是一个开源的 高性能 HTTP 服务器和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 邮件代理服务器。它由俄罗斯程序员 Igor Sysoev 于 2004 年发布,最初为解决 C10K 问题(单机支持 1 万并发连接)而设计。核心特点:特性说明高性能异步非阻塞事件驱动架构,资源消耗低,支持高并发高可靠性进程模型稳定,即使高负载下也不会崩溃热部署支持不停机更新配置、升级版本模块化设计功能通过模块扩展,灵活可定制反向代理与负载均衡支持多种负载均衡算法静态资源服务高效处理 HTML、CSS、JS、图片等静态文件二、Nginx 架构原理:为什么这么快?1. 事件驱动 + 异步非阻塞与传统 Apache 的 多进程/多线程模型(每个连接占用一个进程/线程)不同,Nginx 采用 事件驱动的异步非阻塞 I/O 模型。Master 进程:管理进程,不处理请求。Worker 进程:每个 Worker 采用单线程 + 事件循环(Event Loop)处理成千上万个并发连接。I/O 多路复用:使用 epoll(Linux)、kqueue(BSD)等机制,一个进程可监听多个 socket。✅ 优势:内存占用少,上下文切换开销小,轻松应对数万并发连接。三、Nginx 的核心应用场景1. 静态 Web 服务器Nginx 是服务静态资源的绝佳选择,性能远超应用服务器(如 Tomcat)。server { listen 80; server_name www.example.com; location / { root /var/www/html; # 静态文件目录 index index.html; } # 缓存静态资源 location ~* \.(jpg|jpeg|png|css|js)$ { expires 1y; add_header Cache-Control "public, immutable"; }}2. 反向代理(Reverse Proxy)Nginx 作为“门面”,接收客户端请求,转发给后端应用服务器(如 Java、Python、Node.js),并返回响应。server { listen 80; server_name api.example.com; location / { proxy_pass http://127.0.0.1:8080; # 转发到本地 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; }}✅ 优势:隐藏后端服务器真实 IP统一入口,便于管理提升安全性3. 负载均衡(Load Balancing)Nginx 可将请求分发到多个后端服务器,实现横向扩展与高可用。配置示例:upstream backend { # 负载均衡算法 least_conn; # 最少连接 # round-robin; # 轮询(默认) # ip_hash; # IP 哈希(会话保持) # hash $request_uri; # 一致性哈希 server 192.168.1.10:8080 weight=3; # 权重 3 server 192.168.1.11:8080; server 192.168.1.12:8080 backup; # 备用服务器}server { listen 80; location / { proxy_pass http://backend; }}4. SSL/TLS 加密(HTTPS)Nginx 可作为 SSL 终端,处理 HTTPS 请求并解密后转发给后端 HTTP 服务。server { listen 443 ssl http2; server_name www.example.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/private.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512; location / { proxy_pass http://backend; }}✅ 推荐:使用 Let's Encrypt 免费证书 + Certbot 自动续期。5. 缓存加速Nginx 支持反向代理缓存,减少后端压力,提升响应速度。# 定义缓存区proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;server { location / { proxy_cache my_cache; proxy_pass http://backend; proxy_cache_valid 200 302 10m; # 缓存 10 分钟 add_header X-Cache-Status $upstream_cache_status; }}缓存命中时,X-Cache-Status 返回 HIT,否则为 MISS。6. URL 重写与重定向# 301 永久重定向rewrite ^/old-page$ /new-page permanent;# 条件重写if ($http_user_agent ~* "bot|spider") { rewrite ^/.*$ /robots.txt break;}# 伪静态rewrite ^/article/(\d+)\.html$ /article.php?id=$1 last;四、常用配置指令详解指令作用listen监听端口和 IPserver_name匹配域名location定义 URL 路由规则root / alias文件路径映射proxy_pass反向代理目标upstream定义后端服务器组try_files尝试多个文件路径(常用于 SPA 路由)gzip启用 Gzip 压缩SPA 应用路由支持(如 Vue、React)location / { root /var/www/app; try_files $uri $uri/ /index.html;}确保前端路由刷新不 404。五、性能优化建议1. Worker 进程优化worker_processes auto; # 通常设置为 CPU 核心数worker_connections 1024; # 每个 Worker 最大连接数worker_rlimit_nofile 65535; # 提升文件描述符限制2. 开启 Gzip 压缩gzip on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml;3. 启用 HTTP/2listen 443 ssl http2;减少延迟,提升加载速度。4. 静态资源缓存location ~* \.(css|js|jpg|png|gif)$ { expires 1y; add_header Cache-Control "public, immutable";}六、安全加固1. 隐藏 Nginx 版本号server_tokens off;2. 防止点击劫持add_header X-Frame-Options SAMEORIGIN;3. 防止 XSS 攻击add_header X-Content-Type-Options nosniff;add_header Content-Security-Policy "default-src 'self'";4. 限制请求频率limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;location /api/ { limit_req zone=api burst=20 nodelay;} 
  • [技术干货] 拌合楼软件开发(29)Nginx反向代理限制境外访问 -转载
    前言:        首先作者知道自己肯定是拉了很多屎在项目代码里面,项目初期想怎么写,怎么简单写就怎么来写,也没搞啥设计模式,就是vs 创建的.net core 项目模板,想着要做前后端分离的时候,已经成了一堆屎山代码,就算一些可能某个客户用不到的功能,我都不想去删除。这样的代码难免有漏洞,好在拌合楼的客户群提决定了他不会有大并发访问,超多用户等等问题要做考虑。 最近日志发现服务器有被扫描的情况,看IP都是写境外的IP,想想还是要采取一些技术防护手段。因为项目都是国内的,所以理论上不会有境外的访问,那么直接把境外的IP给禁止掉,就可以提高一点的安全性。实现的方案:        一、防火墙配置禁止境外IP访问        如果使用深信服、华为等企业级的防火墙在前端防护,那可以配置访问策略直接做限制,只允许境内的IP访问。但是由于作者服务器使用的是阿里云的服务,找了很久都没有看到阿里云在哪里可以设置不允许境外访问。后来发现nginix可以做IP限制,所以最终采取此种方案。        二、Nginx做反向代理限制境外IP不能访问        因为没有采用IIS来跑.net core 程序,直接用的linux来跑,本身就要用nginx来做反向代理后端的.net 程序。所以这个方案是比较适合作者的需求的。实现的路径:        一、Ngnix编译添加ngx_http_geoip2_module        1.  安装 geoip2 扩展依赖         yum install libmaxminddb-devel -yAI写代码        2.  查看自己安装的nginx编译的参数        [root@##### ~]# nginx -Vnginx version: nginx/1.24.0built by gcc 10.2.1 20200825 (#### 10.2.1-3.8 2.32) (GCC) built with OpenSSL 1.1.1q  5 Jul 2022TLS SNI support enabledconfigure arguments: --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --add-module=/www/server/nginx/src/ngx_http_substitutions_filter_module-master --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-moduleAI写代码        3. 下载geoip模块        作者这里是使用宝塔面板直接安装的nginx,进入到nginx源码目录 /www/server/nginx/src 下,下载ngx_http_geoip2_module。        git clone https://github.com/leev/ngx_http_geoip2_module.gitAI写代码        4. 编译添加模块               重新编译nginx,会报错没有Luajit,如下图         可以yum来安装luajit        yum intall luajit luajit-develAI写代码        但是安装了还是会报这个错,需要设置下系统变量,修改/etc/profile 在最后一行增加export LUAJIT_LIB=/usr/local/libexport LUAJIT_INC=/usr/local/include/luajit-2.1AI写代码        LUAJIT_INC的值按照实际安装的版本做修改。source /etc/profileAI写代码       让变量生效后,然后再运行configure ./configure --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit  --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module-ng-1.3.0 --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module  --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --add-module=/www/server/nginx/src/ngx_http_substitutions_filter_module-master --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module --with-http_v3_module  --add-module=/www/server/nginx/src/ngx_http_geoip2_modulemakemake installAI写代码bash        完成后在运行 nginx -V 就可以看到module加载有geoip2        二、下载IP地址文件     模块安装成功后,还要在 Nginx 里指定数据库,在安装运行库时默认安装了两个,位于 /usr/share/GeoIP/ 目录下,一个只有 IPv4,一个包含 IPv4 和 IPv6 ,可以登录www.maxmind.com 网址,创建账户 下载最新的库文件。        作者找了好久都没有找到这个网站的注册入口地址,找不到那么就问问AI,可以通过点击这个链接来注册: https://www.maxmind.com/en/geolite2/signup  境外的公司,信息随便填,注意邮箱要填写正确,后面要用来收邮件设置密码和接收验证码。 国内的qq邮箱有可能会收不到,可以用微软的live邮箱了,每次登录都会要接收邮件验证码才可以登录。登录到后台,可以下载到免费的数据,因为只需要国家的,我们下载国家的即可。               注意如果你想下载城市的数据,会出现如下提示,大概率是对IP访问认为是中国的都做了限制,作者还挂代理,也同样下载不了,估计是关联了账户,修改了注册时候的国家,发现也还是出现这个问题。        试了其他方法,包括重新注册账号,且换了谷歌游览器的无痕模式,挂VPN访问,结果注册时候就提示,不知道他怎么知道我挂了VPN。由于只需要到国家的数据,其他数据不影响,作者也就没去纠结了。        解压缩包,我们需要的就是 GeoLite2-Country.mmdb 这个数据文件。        三、上传数据到模块指定文件夹        编译geoip模块的时候会自动有国家和城市的IP数据,但这个数据很老了。目录在/usr/share/GeoIP 下,图中是因为作者把文件做了备份,从时间上可以看出两个数据的文件是2018年的。         四、修改Nginx的配置文件        作者在这里踩了个坑,使用宝塔配置http和server配置是分开的。需要在nginx的配置文件http块中修改增加如下配置                geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {        auto_reload 5m;        $geoip2_data_country_code country iso_code;        }        map $geoip2_data_country_code $allowed_country {        default no;        CN yes;        }AI写代码bash        然后再到站点的server里面去配置,如果不是允许的国家,那么全部返回404   if ($allowed_country = no) {        return 404;        }AI写代码bash        重启就OK了————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/waxyy002/article/details/153265307
  • [技术干货] Nginx 配置详解-转载
    Nginx 是一款高性能的 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在互联网领域应用广泛。其配置文件采用模块化结构,通过配置文件可以灵活实现负载均衡、动静分离、虚拟主机等功能。一、配置文件基础结构Nginx 的主配置文件通常位于/etc/nginx/nginx.conf,其他配置文件可通过include指令包含进来:# 全局块:配置影响nginx全局的指令,通常是和nginx服务运行相关的参数user  nginx;           # 运行用户worker_processes  1;   # 工作进程数,通常设置为CPU核心数 # 错误日志配置error_log  /var/log/nginx/error.log warn;pid        /var/run/nginx.pid; # events块:影响nginx服务器与用户的网络连接events {    worker_connections  1024;  # 每个工作进程的最大连接数} # http块:配置代理、缓存、日志定义等绝大多数功能和第三方模块的配置http {    include       /etc/nginx/mime.types;  # 文件扩展名与类型映射表    default_type  application/octet-stream;  # 默认文件类型        # 日志格式定义    log_format  main  '$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;        # 连接超时设置    sendfile        on;    keepalive_timeout  65;        # 虚拟主机配置    include /etc/nginx/conf.d/*.conf;}AI生成项目二、配置块详解Nginx 配置块详解-CSDN博客 三、虚拟主机配置 (server 块)虚拟主机是 Nginx 最常用的功能之一,可以在一台服务器上运行多个网站:# 基于域名的虚拟主机配置server {    listen       80;                # 监听端口    server_name  example.com;       # 域名        # 访问日志    access_log  /var/log/nginx/example.access.log;        # 默认请求处理    location / {        root   /var/www/example;    # 网站根目录        index  index.html index.htm;  # 默认首页文件    }        # 错误页面配置    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   /usr/share/nginx/html;    }} # 另一个虚拟主机server {    listen       80;    server_name  blog.example.com;        location / {        proxy_pass http://127.0.0.1:8080;  # 反向代理到后端服务        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;    }}AI生成项目四、反向代理与负载均衡配置Nginx 最强大的功能之一就是反向代理和负载均衡:# 定义后端服务器集群upstream backend_servers {    # 轮询调度(默认)    server 192.168.1.100:8080 weight=5;  # 权重为5    server 192.168.1.101:8080 weight=3;  # 权重为3    server 192.168.1.102:8080 weight=2;  # 权重为2        # 会话保持(基于IP哈希)    # ip_hash;        # 健康检查    keepalive 32;} server {    listen 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;                # 超时设置        proxy_connect_timeout 30s;        proxy_send_timeout 60s;        proxy_read_timeout 60s;                # 缓冲区设置        proxy_buffer_size 32k;        proxy_buffering on;        proxy_buffers 4 128k;        proxy_busy_buffers_size 256k;        proxy_max_temp_file_size 256k;    }}AI生成项目五、动静分离配置将动态请求和静态请求分开处理,提高性能:server {    listen 80;    server_name example.com;        # 静态文件处理    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {        root /var/www/static;  # 静态文件目录        expires 7d;             # 缓存7天        access_log off;         # 关闭访问日志        add_header Cache-Control "public";    }        # 动态请求处理    location / {        proxy_pass http://backend_servers;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;    }}AI生成项目六、HTTPS 配置配置 HTTPS 需要 SSL 证书:server {    listen 80;    server_name example.com;    return 301 https://$host$request_uri;  # 强制跳转HTTPS} server {    listen 443 ssl;    server_name example.com;        # SSL证书配置    ssl_certificate /path/to/cert.pem;       # 证书文件    ssl_certificate_key /path/to/key.pem;   # 私钥文件        # SSL会话缓存    ssl_session_cache shared:SSL:10m;    ssl_session_timeout 10m;        # SSL协议和加密算法    ssl_protocols TLSv1.2 TLSv1.3;    ssl_prefer_server_ciphers on;    ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384";        # 其他配置    location / {        root /var/www/example;        index index.html;    }}AI生成项目七、访问控制配置限制特定 IP 或用户访问:server {    listen 80;    server_name example.com;        # 基于IP的访问控制    location /admin {        deny 192.168.1.1;            # 拒绝单个IP        allow 192.168.1.0/24;       # 允许整个网段        allow 10.1.1.0/16;        deny all;                   # 拒绝其他所有    }        # 基于密码的访问控制    location /private {        auth_basic "Restricted Area";        auth_basic_user_file /etc/nginx/.htpasswd;    }}AI生成项目八、缓存配置配置 Nginx 缓存可以显著提高性能:http {    # 定义缓存区域    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;        server {        listen 80;        server_name example.com;                location / {            proxy_pass http://backend_servers;                        # 启用缓存            proxy_cache my_cache;            proxy_cache_valid 200 302 10m;  # 200和302状态码缓存10分钟            proxy_cache_valid 404 1m;        # 404状态码缓存1分钟                        # 设置缓存键            proxy_cache_key "$scheme$request_method$host$request_uri";                        # 缓存控制头            add_header X-Cache $upstream_cache_status;        }    }}AI生成项目九、Gzip 压缩配置启用 Gzip 可以减小传输数据量,提高加载速度:http {    # Gzip压缩配置    gzip on;    gzip_disable "msie6";  # 对IE6禁用        # 压缩级别和类型    gzip_vary on;    gzip_proxied any;    gzip_comp_level 6;    gzip_buffers 16 8k;    gzip_http_version 1.1;    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;}AI生成项目十、常见问题与优化1)配置加载:修改配置后无需重启服务nginx -s reloadAI生成项目2)检查配置语法:修改配置后检查语法是否正确nginx -tAI生成项目3)优化建议:worker_processes 设置为 CPU 核心数根据内存大小调整 worker_connections静态文件使用长缓存策略启用 HTTP/2 提高传输效率使用 sendfile 加速文件传输4)性能监控:location /nginx_status {    stub_status on;    access_log off;    allow 127.0.0.1;    deny all;}AI生成项目通过 stub_status 模块获取 Nginx 状态Nginx 的配置非常灵活,可以根据实际需求进行定制。以上只是一些常见的配置示例,实际使用时需要根据服务器性能、应用特点和访问量进行调整和优化。————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/ygq13572549874/article/details/148423772
  • [技术干货] 记一次nginx访问快捷方式指向的文件夹失败的排查解决过程
    起因是项目上有一个文件域名,dns解析到linux系统的服务器上,有一个nginx服务反向代理了一个位于nas挂载盘内的文件目录,现在有一个新需求是让客户还是通过这个域名作为访问入口,访问同样位于nas盘中和这个目录同级的另一个目录内的文件。比如通过nginx反向代理访问的nas盘下的目录路径为/mnt/picture/,访问的url为:https://picture.test.cn/cache/20260101/1749690185966.jpg和picture同级的目录路径为:/mnt/bak/,期望的访问url为:https://picture.test.cn/bak/20251024/1749690185966.jpg我第一时间想到的就是通过软连接的方式,将/mnt/bak目录软连接到/mnt/picture/bak目录:ln -s /mnt/bak/ /mnt/picture/baknginx的配置简略如下:server { listen 443; server_name picture.test.cn; ... location / { root /mnt/picture/; }}访问没有问题,当然还可以通过增加一个location,使用bak关键字代理/mnt/bak/目录。本地开发机器是windwos10,在一个盘符下创建了两个文件夹模拟了linux机器上的挂载盘目录进行开发测试,nginx的配置简略如下:server { listen 8066; server_name picture.test.cn; location / { root D:/tmp/mnt/picture/; }}两个目录分别是:D:/tmp/mnt/picture/、D:/tmp/mnt/bak我在D:/tmp/mnt/picture/下创建了一个D:/tmp/mnt/bak目录的快捷方式,快捷方式的名称叫bak,hosts文件中配置域名到本机的映射。访问http://picture.test.cn:8066/bak/20251024/1749690185966.jpg却提示我文件不存在:nginx的error日志如下:2026/10/24 09:41:16 [error] 16584#7532: *4 CreateFile() "D:/tmp/mnt/picture/bak/20251024/1749690185966.jpg" failed (3: The system cannot find the path specified), client: 127.0.0.1, server: picture.test.cn, request: "GET /bak/20251024/1749690185966.jpg HTTP/1.1", host: "picture.test.cn:8066"明明我可以在文件系统中点击快捷方式进入对应的文件夹,为啥nginx却不识别,问了下ai(不得不说现在ai确实是一个好帮手),其核心原因有这些:1.快捷方式本质是特殊文件Windows快捷方式(.lnk)是系统级符号链接文件,需由操作系统解析路径。但Nginx作为Web服务器,仅读取实际文件或目录内容,不会解析.lnk文件的目标路径。2.Nginx配置依赖物理路径Nginx的root或alias指令需指向真实目录(如D:\folder),若指向含快捷方式的目录,Nginx会将快捷方式视为普通文件而非目录入口,导致访问失败。3.路径安全限制Nginx默认禁止访问路径含符号链接的文件(安全策略),且Windows路径格式(反斜杠\、中文名等)易引发兼容性问题。ai提供了解决方案:1.NTFS 联结点(Junction Point)实现类似 Linux 软链接的效果文件系统需要是NTFS,以管理员身份运行CMD:mklink /J "D:\tmp\mnt\picture\bak" "D:\tmp\mnt\bak"2.修改Nginx配置启用路径解析nginx的location下增加如下配置:disable_symlinks off; # 允许解析符号链接其中disable_symlinks于nginx的1.1.15版本中增加,默认开启,需要在编译nginx时增加--with-file-aio参数。通过nginx -v和nginx -V确认项目上使用的nginx版本为1.22.0,服务器上的nginx也启用了--with-file-aio参数。为何Nginx在Linux支持软链接而Windows不支持快捷方式?ai给出了回答:Linux:Nginx 通过系统调用(如 open())访问文件时,内核自动解析软链接路径,服务无需额外处理。Windows:Nginx 直接读取文件系统,但 .lnk 是需解析的二进制文件,非标准目录入口,因此无法识别其指向的真实路径。按照ai给出的解决方案,我在本地windows机器上使用mklink创建了目录联结:mklink /J "D:\tmp\mnt\picture\bak" "D:\tmp\mnt\bak"再次访问http://picture.test.cn:8066/bak/20251024/1749690185966.jpg已经可以访问。我让ai详细说说mklinkmklink 是 Windows 系统(Vista 及以上版本)提供的命令行工具,用于创建文件或目录的链接,其功能类似于 Linux 中的 ln 命令,但实现机制和类型划分更为复杂。以下是其核心特性和使用场景的详细解析:1.mklink 的链接类型2.关键差异与注意事项权限要求符号链接(/D)和文件硬链接(/H)需管理员权限运行 CMD,目录联结(/J)则不需要。路径解析符号链接支持相对路径(如 ..\target),联结仅支持绝对路径。移动符号链接可能导致相对路径失效,而联结的绝对路径仍有效。跨分区限制硬链接不可跨分区,符号链接和联结可跨分区但需目标存在。可以看到通过快捷方式和mklink命令创建出来的文件是可以同名的,但是其类型不一样,一个是快捷方式,一个是文件夹ai还提到了nginx的disable_symlinks标签需要防止攻击者通过上传符号链接文件访问/etc/passwd 等系统文件,我在windows上测试添加这个标签发现,windows上的nginx并不支持这个标签,其核心限制原因如下:1.平台兼容性问题disable_symlinks 是 Nginx 针对类 Unix 系统(如 Linux)设计的特性,依赖文件系统符号链接权限检查机制,而Windows NTFS 文件系统的符号链接管理逻辑与此不兼容,导致该指令在 Windows 环境下无效或无法正确解析。尝试在 Windows 配置中使用时,nginx -t 会提示语法错误或未知指令(如 unknown directive "disable_symlinks")。2.版本无实质支持即使用户使用的是较新的 Nginx 1.22.0 或更高版本,其Windows 编译版仍未适配此功能。官方并未在 Windows 构建中启用相关依赖模块(如 --with-file-aio)。本地windwos机器只是用来开发测试,倒是不影响,生产服务器上需要严格做好目录权限的划分以及在上传文件的入口强校验文件的类型。转载自https://www.cnblogs.com/imadc/p/18938385
  • [技术干货] OpenResty 入门实战(1)--简介及安装
    本文介绍的 OpenResty 为开源版本 OpenResty,官网地址为:https://openresty.org/cn/,如需了解商业版本,可访问商业官网:https://openresty.com.cn/cn/;文中所使用到的软件版本:OpenResty 1.21.4.2、pcre 8.43、opnessl 1.1.1s、zlib 1.2.11、CentOS 7.9.2009。1、简介OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。OpenResty® 的目标是让你的 Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。2、安装OpenResty 的安装与 Nginx 基本一致。2.1、下载源码OpenResty 源码:https://openresty.org/cn/download.htmlpcre 源码:http://www.pcre.org/openssl 源码:https://www.openssl.org/source/zlib 源码:http://www.zlib.net/下载后解压:tar zxvf openresty-1.21.4.2.tar.gzunzip pcre-8.43.ziptar zxvf openssl-1.1.1s.tar.gztar zxvf zlib-1.2.11.tar.gz2.2、编译安装cd openresty-1.21.4.2./configure --prefix=/home/mongo/soft/openresty-1.21.4.2 --with-luajit --with-pcre=/home/mongo/installfile/pcre-8.43 --with-http_ssl_module --with-openssl=/home/mongo/installfile/openssl-1.1.1s --with-zlib=/home/mongo/installfile/zlib-1.2.11 --with-mail --with-streammakemake install--with-luajit 表示使用默认的 luajit,也可以指定其他的 luajit 目录;其他参数说明可参考:Nginx 入门实战(1)--简介及安装。2.3、启动OpenResty 同 Nginx 一样默认配置了一个端口为 80 Http 服务器,使用普通用户启动需要修改该端口;编辑 conf/nginx.conf 文件:http { include mime.types; default_type application/octet-stream; ... server { listen 8080; ...执行启动命令:sbin/nginx启动后访问 8080 端口:2.4、停止及重启sbin/nginx -s stop #停止sbin/nginx -s reload #重启
  • [技术干货] Tengine 入门实战(2)--简单使用
    本文主要介绍 Tengine 的主动式后端服务器健康检查的扩展功能,其他的扩展功能可参考官网文档:http://tengine.taobao.org/;文中所使用到的软件版本:Centos 7.9.2009、Tengine 2.3.3。1、相关指令1.1、checkSyntax: check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp] [port=check_port]Default: 如果没有配置参数,默认值是:interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcpContext: upstream该指令用于打开后端服务器的健康检查功能。参数含义:interval:向后端发送的健康检查包的间隔。fall(fall_count): 如果连续失败次数达到 fall_count,服务器就被认为是 down。rise(rise_count): 如果连续成功次数达到 rise_count,服务器就被认为是 up。timeout: 后端健康请求的超时时间。default_down: 设定初始时服务器的状态,如果是 true,就说明默认是 down 的,如果是 false,就是 up 的。默认值是 true,也就是一开始服务器认为是不可用,要等健康检查包达到一定成功次数以后才会被认为是健康的。type:健康检查包的类型,现在支持以下多种类型tcp:简单的 tcp 连接,如果连接成功,就说明后端正常。ssl_hello:发送一个初始的 SSL hello 包并接受服务器的 SSL hello 包。http:发送 HTTP 请求,通过后端的回复包的状态来判断后端是否存活。mysql: 向 mysql 服务器发送连接,通过接收服务器的 greeting 包来判断后端是否存活。ajp:向后端发送 AJP 协议的 Cping 包,通过接收 Cpong 包来判断后端是否存活。port: 指定后端服务器的检查端口。你可以指定不同于真实服务的后端服务器的端口,比如后端提供的是 443 端口的应用,你可以去检查 80 端口的状态来判断后端健康状况。默认是 0,表示跟后端 server 提供真实服务的端口一样。1.2、check_keepalive_requestsSyntax: check_keepalive_requests request_numDefault: 1Context: upstream该指令用于配置一个连接发送的请求数,其默认值为 1,表示 Tengine 完成 1 次请求后即关闭连接。1.3、check_http_sendSyntax: check_http_send http_packetDefault: "GET / HTTP/1.0\r\n\r\n"Context: upstream该指令用于配置 http 健康检查包发送的请求内容。为了减少传输数据量,推荐采用 "HEAD" 方法。当采用长连接进行健康检查时,需在该指令中添加 keep-alive 请求头,如:"HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n"。同时,在采用 "GET" 方法的情况下,请求 uri 的 size 不宜过大,确保可以在 1 个 interval 内传输完成,否则会被健康检查模块视为后端服务器或网络异常。1.4、check_http_expect_aliveSyntax: check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]Default: http_2xx | http_3xxContext: upstream该指令指定 HTTP 响应的成功状态,默认认为 2XX 和 3XX 的状态是健康的。1.5、check_shm_sizeSyntax: check_shm_size sizeDefault: 1MContext: http所有的后端服务器健康检查状态都存于共享内存中,该指令用于设置共享内存的大小。默认是 1M,如果你有 1 千台以上的服务器并在配置的时候出现了错误,就可能需要扩大该内存的大小。1.6、check_statusSyntax: check_status [html|csv|json]Default: check_status htmlContext: location显示服务器的健康状态页面。2、使用样例upstream cluster { server 10.49.196.30:8080 weight=2; server 10.49.196.31:8080 weight=3; check interval=3000 rise=2 fall=5 timeout=2000 type=http; check_keepalive_requests 5; check_http_send "HEAD / HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx;}server { listen 8081; server_name localhost-8081; access_log logs/access-8081.log; location / { proxy_pass http://cluster/; } location /status { check_status; }}后端服务器健康检查,可以避免把请求转发到假死(请求无响应或响应很慢)的服务器上,提高了应用的可用性;监控状态页面如下,可以清晰的看到后端服务器的状态:
  • [技术干货] Tengine 入门实战(1)--简介及安装
    1、简介Tengine 是由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine 的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。Tengine 特性:继承 Nginx-1.18.0 的所有特性,兼容 Nginx 的配置;支持 HTTP 的 CONNECT 方法,可用于正向代理场景;支持异步 OpenSSL,可使用硬件如:QAT 进行 HTTPS 的加速与卸载;增强相关运维、监控能力,比如异步打印日志及回滚,本地 DNS 缓存,内存监控等;Stream 模块支持 server_name 指令;更加强大的负载均衡能力,包括一致性 hash 模块、会话保持模块,还可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线,以及动态解析 upstream 中出现的域名;输入过滤器机制支持。通过使用这种机制 Web 应用防火墙的编写更为方便;支持设置 proxy、memcached、fastcgi、scgi、uwsgi 在后端失败时的重试次数;动态脚本语言 Lua 支持。扩展功能非常高效简单;支持按指定关键字(域名,url等)收集 Tengine 运行状态;组合多个 CSS、JavaScript 文件的访问请求变成一个请求;自动去除空白字符和注释从而减小页面的体积自动根据 CPU 数目设置进程个数和绑定 CPU 亲缘性;监控系统的负载和资源占用从而对系统进行保护;显示对运维人员更友好的出错信息,便于定位出错机器;;更强大的防攻击(访问速度限制)模块;更方便的命令行参数,如列出编译的模块列表、支持的指令等;支持 Dubbo 协议;可以根据访问文件类型设置过期时间;Tengine 的最新版本为 2.3.3(基于 Nginx 1.8.0),发布日期为 2021-03-25,版本更新比较慢。2、安装Tengine 的安装与 Nginx 基本一致,这里所使用到的软件版本:tengine 2.3.3、pcre 8.43、opnessl 1.1.1s、zlib 1.2.11、CentOS 7.9.20092.1、下载源码tengine 源码:http://tengine.taobao.org/download_cn.htmlpcre 源码:http://www.pcre.org/openssl 源码:https://www.openssl.org/source/zlib 源码:http://www.zlib.net/下载后解压:tar zxvf tengine-2.3.3.tar.gzunzip pcre-8.43.ziptar zxvf openssl-1.1.1s.tar.gztar zxvf zlib-1.2.11.tar.gz2.2、编译安装cd tengine-2.3.3./configure --prefix=/home/mongo/soft/tengine-2.3.3 --with-pcre=/home/mongo/installfile/pcre-8.43 --with-http_stub_status_module --with-http_ssl_module --with-openssl=/home/mongo/installfile/openssl-1.1.1s --with-zlib=/home/mongo/installfile/zlib-1.2.11 --with-mail --with-stream --add-module=modules/ngx_http_upstream_check_modulemakemake install--add-module=modules/ngx_http_upstream_check_module 表示添加 Tengine 扩展的主动式后端服务器健康检查模块,其他参数说明可参考:Nginx 入门实战(1)--简介及安装。2.3、启动Tengine 同 Nginx 一样默认配置了一个端口为 80 Http 服务器,使用普通用户启动需要修改该端口;编辑 conf/nginx.conf 文件:http { include mime.types; default_type application/octet-stream; ... server { listen 8080; ...执行启动命令:sbin/nginx启动后访问 8080 端口:2.4、停止及重启sbin/nginx -s stop #停止sbin/nginx -s reload #重启
  • [技术干货] Nginx 入门实战(5)--location 指令说明
    1、location 指令介绍1.1、语法语法位置location [ = | ~ | ~* | ^~ ] uri { ... }location @name { ... }server, location1.2、匹配类型类型说明=精确匹配空 或 ^~字符串匹配如果 ^~ 是最长的字符串匹配,则停止搜索后续的正则匹配~区分大小写的正则匹配~*不区分大小写的正则匹配1.3、uri 正则表达式表达式说明*重复前面的字符 0 次或多次?重复前面的字符 0 次或 1 次+重复前面的字符 1 次或多次.匹配除换行符以外的任意一个字符^以什么开头$以什么结尾\S非空白字符|或()捕获组1.4、匹配优先级精确匹配(=) > 字符串匹配(长 > 短 [注: 如果 ^~ 是最长匹配则停止后续正则匹配]) > 正则匹配(上 > 下)精确匹配只能命中一个字符串匹配使用匹配最长的最为匹配结果正则匹配按照 location 定义的顺序进行匹配,先定义具有高优先级字符串匹配和正则匹配:字符串匹配优先搜索,但是只是记录下最长的匹配 ( 如果 ^~ 是最长的匹配,则会直接命中,停止搜索正则 );然后继续搜索正则匹配,如果有正则匹配,则命中正则匹配;如果没有正则匹配,则命中最长的字符串匹配。2、使用样例location = / { [ configuration A ]}location / { [ configuration B ]}location /documents/ { [ configuration C ]}location ^~ /images/ { [ configuration D ]}location ~* \.(gif|jpg|jpeg)$ { [ configuration E ]}"/" 请求将匹配配置 A,"/index.html" 请求将匹配配置 B,"/documents/document.html" 请求将匹配配置 C,"/images/1.gif" 请求将匹配配置 D,而 "/documents/1.jpg" 请求将匹配配置 E。  参考:https://nginx.org/en/docs/http/ngx_http_core_module.html#location。
  • [技术干货] Nginx 入门实战(4)--Nginx 常用变量说明
    Nginx 中的很多参数可以使用内置的变量来设置,本文主要介绍一些常用的变量。1、Nginx 配置文件中变量使用http { ... log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; ... server { listen 8089; server_name localhost; location /abc { proxy_pass http://10.49.196.30:8080/abc; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ... } ...在该配置文件中使用多个变量来定义日期格式(log_format),并使用变量来设置传递给代理服务器的请求头(proxy_set_header)。2、常用变量说明变量说明$arg_name表示请求行中的任意参数,name 为参数名称$args表示请求行中的参数部分$binary_remote_addr二进制形式表示的客户端地址$body_bytes_sent发送到客户端的字节数,不包括响应头$bytes_received接受到客户端的字节数$bytes_sent发送到客户端的字节数$connection连接序列号$connection_requests当前连接的请求数量$connection_time连接时间,单位为:ms$cookie_name表示任意 cookie,name 为 cookie 名称$date_gmtGMT 时间$date_local本地时间$host按照以下顺序获取主机信息:请求行中的主机名,或“Host”请求头字段中的主机名,或与请求匹配的服务器名。$hostname主机名$http_name表示任意请求头;name 为请求头名称,其中破折号被下划线替换并转换为小写;如:$http_user_agent,$http_x_forwarded_for$proxy_add_x_forwarded_for将 $remote_addr 的值附加到“X−Forwarded−For”客户端请求头中,由逗号分隔。如果客户端请求头中不存在“X−Forwarded−For”,则 $proxy_add_x_forwarded_for 等于 $remote_addr 。$proxy_host代理服务器的地址和端口$proxy_port代理服务器的端口$query_string同 $args$remote_addr客户端地址$remote_port客户端端口$remote_userBasic 身份验证中提供的用户名$request完整请求行$request_body 请求体$request_body_file保存请求体的临时文件$request_length请求长度(包括请求行、头部和请求体)$request_method请求方法$request_time请求处理时间,单位为:ms$request_uri完整请求行$scheme请求协议,http 或 https$server_addr接受请求的服务器地址$server_name接受请求的服务器名称$server_port接受请求的服务器端口$server_protocol请求协议,通常为 HTTP/1.0、HTTP/1.1 或 HTTP/2.0$ssl_cipher建立 SSL 连接所使用的加密套件名称$ssl_ciphers客户端支持的加密套件列表$ssl_client_escaped_cert客户端 PEM 格式的证书$ssl_protocol建立 SSL 连接的协议$status响应状态码$time_iso8601ISO 8601 标准格式的本地时间$time_localCommon Log 格式的本地时间$upstream_addrupstream 服务器的 ip 和端口$upstream_bytes_received从 upstream 服务器接收的字节数$upstream_bytes_sent发送给 upstream 服务器的字节数$upstream_http_name表示 upstream 服务器任意响应头,name 为响应头名称,其中破折号被下划线替换并转换为小写$upstream_response_lengthupstream 服务器的响应长度,单位为:字节$upstream_response_timeupstream 服务器的响应时间,单位为:秒$upstream_statusupstream 服务器的响应状态码$uri 请求 uri    参考:https://nginx.org/en/docs/varindex.html。
  • [技术干货] Nginx 入门实战(3)--Nginx 常用配置参数说明
    Nginx 中包含众多的参数,这些参数影响 Nginx 的行为;本文主要介绍一些常用的参数。1、Nginx 配置文件基本结构Nginx 的配置文件为 conf/nginx.conf,配置文件由配置指令/参数组成,有些指令/参数位于 main 的位置(如:events、http),有些指令/参数位于其他参数下(如:server 位于 http 下);以下是一个简单的 Nginx 配置文件样例,其中配置了一个端口为 8080 的 http 服务,还配置了一个端口为 9090 的 TCP 服务。worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 8080; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}stream { server { listen 9090; proxy_pass 10.49.196.30:9090; }}2、常用参数说明参数说明默认值位置access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];access_log off;设置访问日志文件及日志格式access_log logs/access.log combined;http, server, location, if in location, limit_exceptaccess_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];access_log off;设置访问日志文件及日志格式 http, server, location, if in location, limit_exceptadd_header name value [always];添加响应头 http, server, location, if in locationalias path;设置目录别名,location 必须用 "/" 结束;文件的路径通过将 URI 去除 location 部分再添加到 alias 指令的值来构建。 locationallow address | CIDR | unix: | all;设置允许访问的地址 http, server, location, limit_exceptauth_basic string | off;使用“HTTP基本身份验证”协议对用户名和密码进行验证auth_basic off;http, server, location, limit_exceptauth_basic_user_file file;设置用户名/密码文件 http, server, location, limit_exceptautoindex on | off;是否列出目录下的文件autoindex off;http, server, locationautoindex_exact_size on | off;on:显示文件的确切大小,单位为 byte;off:显示文件的大概大小,单位为 K、M、Gautoindex_exact_size on;http, server, locationautoindex_localtime on | off;on:显示文件的本地时间;off:显示文件的 UTC 时间autoindex_localtime off;http, server, locationcharset charset | off;将指定的字符集添加到“Content-Type”响应头中 charset off;http, server, location, if in locationclient_body_buffer_size size;设置客户端请求正文的缓冲区大小client_body_buffer_size 8k|16k;http, server, locationclient_header_buffer_size size;设置客户端请求头的缓冲区大小client_header_buffer_size 1k;http, serverclient_max_body_size size;设置客户端请求正文的最大允许大小client_max_body_size 1m;http, server, location default_type mime-type; 定义响应的默认 MIME 类型 efault_type text/plain; http, server, locationdeny address | CIDR | unix: | all; 设置拒绝访问的地址  http, server, location, limit_excepterror_log file [level];设置日志文件及日志级别error_log logs/error.log error;main, http, mail, stream, server, locationerror_page code ... [=[response]] uri; 设置错误页面 uri http, server, location, if in locationevents { ... }连接相关配置上下文 maingzip on | off;响应是否使用 gzip 压缩 gzip off;http, server, location, if in locationhttp { ... }Http 配置上下文  maininclude file | mask;通过文件名或文件权限码引入文件 anyindex file ...;设置初始页面文件;可以设置多个文件,Nginx 会按照指定顺序来检查,在找到一个存在的文件后停止检查。index index.html;http, server, locationip_hash;基于客户端 IP 分配请求的负载均衡方法 upstreamkeepalive_timeout timeout [header_timeout];第一个参数设置保持活动状态的超时时间,第二个参数设置响应头:Keep-Alive: timeout=timekeepalive_timeout 75s;http, server, locationlarge_client_header_buffers number size;设置大客户端请求头的缓冲区数量和大小large_client_header_buffers 4 8k; http, server least_conn;一种负载均衡算法:请求被分配给具有最少活动连接数的服务器 upstreamlimit_conn zone number;[ngx_http_limit_conn_module]设置使用的共享内存区域及最大并发连接数;如:limit_conn perserverZone 5; http, server, locationlimit_conn zone number;[ngx_stream_limit_conn_module]设置使用的共享内存区域及最大并发连接数;如:limit_conn perserverZone 5; stream, serverlimit_conn_zone key zone=name:size;[ngx_http_limit_conn_module]设置共享内存区域,包括存储的 key、区域名称及区域大小;如:limit_conn_zone $server_name zone=perserverZone:10m; httplimit_conn_zone key zone=name:size;[ngx_stream_limit_conn_module]设置共享内存区域,包括存储的 key、区域名称及区域大小;如:limit_conn_zone $server_name zone=perserverZone:10m; streamlimit_req zone=name [burst=number] [nodelay | delay=number];设置使用的共享内存区域、超过请求速率的缓存队列大小、缓存中的请求不延迟处理(nodelay)或延迟处理的个数(delay=number);如:limit_req zone=peripZone burst=5 nodelay; http, server, locationlimit_req_zone key zone=name:size rate=rate [sync];设置共享内存区域,包括存储的 key、区域名称、区域大小以及请求速率;如:limit_req_zone $binary_remote_addr zone=peripZone:10m rate=100r/m; httplisten address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol][setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size][accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport][so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol][setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size][sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off][reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol][backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter][deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];设置监听地址,可以同时指定地址和端口,也可以仅指定地址或端口。 listen *:80 | *:8000; serverlocation [ = | ~ | ~* | ^~ ] uri { ... }location @name { ... }配置 URI server, locationlog_format name [escape=default|json|none] string ...;[ngx_http_log_module]定义日志格式,通过 name 指定日志格式的名称log_format combined "...";httplog_format name [escape=default|json|none] string ...;[ngx_stream_log_module]定义日志格式,通过 name 指定日志格式的名称 streampid file;设置主进程的进程ID文件pid logs/nginx.pid;mainproxy_buffer_size size;设置第一代理服务器响应缓冲区大小proxy_buffer_size 4k|8k;http, server, locationproxy_buffering on | off;是否开启代理服务器响应缓冲区proxy_buffering on;http, server, locationproxy_buffers number size;设置代理服务器响应缓冲区数量和大小proxy_buffers 8 4k|8k;http, server, locationproxy_busy_buffers_size size;设置在响应未完全读取的情况下可以用于向客户端发送响应的所有缓冲区的总大小proxy_busy_buffers_size 8k|16k;http, server, locationproxy_connect_timeout time;设置与代理服务器建立连接的超时时间proxy_connect_timeout 60s;http, server, locationproxy_read_timeout time;设置从代理服务器读取响应的超时时间proxy_read_timeout 60s;http, server, locationproxy_send_timeout time;设置向代理服务器传输请求的超时时间proxy_send_timeout 60s;http, server, locationproxy_pass URL; 设置代理地址 location, if in location, limit_exceptproxy_set_header field value;重新定义传递给代理服务器的请求头proxy_set_header Host $proxy_host;proxy_set_header Connection close;http, server, locationrewrite regex replacement [flag];URL 重新,用于请求的重定向last:停止当前的重写指令,按新URL重新发起请求,浏览器URL不变(重写URL不以"http://"、"https://"、"$scheme"开头,否则URL改变)。break:停止当前的重写指令,按新 URL 查找资源; 浏览器URL不变(重写URL不以"http://"、"https://"、"$scheme"开头,否则URL改变)。redirect:返回 302 临时重定向,浏览器 URL 改变permanent:返回 301 永久重定向,浏览器 URL 改变 server, location, ifroot path;设置请求的根目录。仅通过将 URI 添加到 root 指令的值来构建文件的路径。如果必须修改URI,则应使用 alias 指令。root html;http, server, location, if in locationsendfile on | off;是否使用 sendfile() 方法sendfile off;http, server, location, if in locationserver { ... } 虚拟服务器配置  httpserver_name name ...;设置虚拟服务器的名称 server_name ""; serverssl_certificate file; 设置虚拟服务器的 PEM 格式证书文件 http, serverssl_certificate_key file; 设置虚拟服务器的 PEM 格式密钥文件 http, serverssl_ciphers ciphers;设置启用的密码套件ssl_ciphers HIGH:!aNULL:!MD5;http, serverssl_client_certificate file;设置用于验证客户端证书的 CA 证书 http, serverssl_prefer_server_ciphers on | off;当使用 SSLv3 和 TLS 协议时,服务器密码套件释放优先于客户端密码套件ssl_prefer_server_ciphers off;http, serverssl_session_cache off | none | [builtin[:size]] [shared:name:size];设置会话缓存的类型和大小ssl_session_cache none;http, serverssl_session_timeout time;设置 session 超时时间ssl_session_timeout 5m;http, serverssl_verify_client on | off | optional | optional_no_ca;是否启用对客户端证书的验证ssl_verify_client off;http, serverstream { ... }TCP 配置上下文 mainstub_status; 开启查看基本状态信息  server, locationtcp_nopush on | off;是否启用 FreeBSD 上的 TCP_NOPUSH 套接字选项或 Linux 上的 TCP_CORK 套接字选项;该选项仅在使用 sendfile 时有效。tcp_nopush off;http, server, locationtry_files file ... uri;try_files file ... =code;按指定顺序检查文件,并使用第一个找到的文件处理请求 server, locationworker_connections number;设置工作进程最大并发连接数worker_connections 512;eventsworker_processes number | auto;设置工作进程的数量worker_processes 1;mainuse method;指定要使用的连接处理方法。通常不需要显式指定,nginx 默认会使用最有效的方法。连接方法的详细说明可参考:https://nginx.org/en/docs/events.html。 eventsuser user [group];设置工作进程的用户和组user nobody nobody;main 
  • [技术干货] Nginx 入门实战(2)--简单使用
    本文主要介绍 Nginx 的实际使用,文中所使用到的软件版本:Centos 7.9.2009、Nginx 1.22.1。1、环境准备这里主要演示使用 Nginx 代理 Http 及 TCP 应用,环境信息如下:主机用途Http 端口TCP 端口10.49.196.30部署 Http、TCP 应用8080909010.49.196.31部署 Http、TCP 应用8080909010.49.196.33部署 Nginx  2、Http 应用配置代理时都新建新的配置文件 conf/http.conf,然后在主配置文件 conf/nginx.conf 中引入该文件:http { include mime.types; default_type application/octet-stream; ... include http.conf; ...}2.1、静态文件server { listen 8080; server_name localhost-8080; access_log logs/access-8080.log; location / { root /home/mongo/mysite; index index.html; }}站点地址为:http://10.49.196.33:8080。2.2、普通代理server { listen 8081; server_name localhost-8081; access_log logs/access-8081.log; location /myapp { proxy_pass http://10.49.196.30:8080/myapp; } location / { proxy_pass https://www.baidu.com; }}代理地址为:http://10.49.196.33:8081/myapp,被代理地址为:http://10.49.196.30:8080/myapp;根地址代理百度网站。2.3、负载均衡upstream cluster { server 10.49.196.30:8080 weight=1; server 10.49.196.31:8080 weight=1; round-robin;}server { listen 8082; server_name localhost-8082; access_log logs/access-8082.log; location /myapp { proxy_pass http://cluster/myapp; }}Nginx 支持三种负载均衡算法:round-robin:轮询(默认算法)least-connected:下一个请求将分配给当前拥有最少活跃连接数的服务器,对应的 Nginx 指令为 least_connip-hash:同一 ip 的请求分配到同一个服务器,对应的 Nginx 指令为 ip_hashNginx 还支持通过指定服务器的权重(weight) 来影响负载均衡算法,上面的配置意味着两台服务器在特定负载均衡算法上具有相同的资格。2.4、配置文件服务器server { listen 8083; server_name localhost-8083; access_log logs/access-8083.log; location / { autoindex on; autoindex_exact_size on; autoindex_localtime on; charset utf-8; root /mnt/centos7; }}2.5、启用 Nginx Statusserver { listen 8083; server_name localhost-8083; access_log logs/access-8083.log; location /nginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; } ...}2.6、限流2.6.1、限制访问频率limit_req_zone $binary_remote_addr zone=peripZone:10m rate=100r/m;server { listen 8081; server_name localhost-8081; access_log logs/access-8081.log; location /myapp { limit_req zone=peripZone burst=5 nodelay; proxy_pass http://10.49.196.30:8080/myapp; }}limit_req_zone 定义了一个名为 peripZone 的共享内存区域,大小为 10M,最大访问速率为:每分钟 100 个请求;该区域以“客户端地址”为 key 来保存状态信息。limit_req 设置使用的共享内存区域,burst 定义了过量请求的缓存队列大小,超过访问速率的请求将保存该队列中;如果缓存队列也慢了将直接返回 503;nodelay 表示缓存队列中请求将不会被延迟处理(虽然超过了请求速率,缓存队列中请求也立即被处理),也可通过 delay=number 来设置缓存队列中请求被延迟处理的个数。2.6.2、限制并发连接数limit_conn_zone $server_name zone=perserverZone:10m;server { listen 8081; server_name localhost-8081; access_log logs/access-8081.log; location /myapp { limit_conn perserverZone 5; proxy_pass http://10.49.196.30:8080/myapp; }}limit_conn_zone 定义了一个名为 perserverZone 的共享内存区域,大小为 10M;该区域以“虚拟服务器名称”为 key 来保存状态信息。limit_conn 设置使用的共享内存区域,并定义最大并发连接数。2.7、配置 Https2.7.1、生成证书启用 Https,需要使用 OpenSSL 创建证书。A、生成根证书openssl genrsa -out ca.keyopenssl req -new -key ca.key -out ca.csropenssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.pemB、生成服务端证书openssl genrsa -out server.keyopenssl req -new -key server.key -out server.csropenssl ca -days 3650 -in server.csr -cert ca.pem -keyfile ca.key -out server.pemC、生成客户端证书openssl genrsa -des3 -out client.key 1024openssl req -new -key client.key -out client.csropenssl ca -days 1500 -in client.csr -cert ca.pem -keyfile ca.key -out client.pemopenssl pkcs12 -export -clcerts -in client.pem -inkey client.key -out client.p12使用 OpenSSL 创建证书的详细说明可参考:OpenSSL 介绍(5)--数字证书;这里生成的证书假设都存放在 /home/mongo/ssl 目录下。2.7.2、Nginx 中配置 Httpsserver { listen 4430 ssl; server_name localhost-8084; access_log logs/access-8084.log; ssl_certificate /home/mongo/ssl/server.pem; ssl_certificate_key /home/mongo/ssl/server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_client_certificate /home/mongo/ssl/ca.pem; ssl_verify_client on; location /myapp { proxy_pass http://10.49.196.30:8080/myapp; }}上述配置开启了客户端验证,客户端访问时需要使用客户端证书(client.p12)来访问;浏览器访问导入该证书即可,Java 客户端的访问可参考:Java调用Http/Https接口(2)--HttpURLConnection/HttpsURLConnection调用Http/Https接口。如果不需要客户端验证,注释掉如下配置即可:ssl_client_certificate /home/mongo/ssl/ca.pem; ssl_verify_client on;3、TCP 应用配置代理时都新建新的配置文件 conf/tcp.conf,然后在主配置文件 conf/nginx.conf 最后该文件:...include tcp.conf;3.1、普通代理stream { server { listen 9090; proxy_pass 10.49.196.30:9090; }}代理地址为:10.49.196.33:9090,被代理地址为:10.49.196.30:9090。3.2、负载均衡stream { upstream tcp3031 { server 10.49.196.30:9090; server 10.49.196.31:9090; } server { listen 9091; proxy_pass tcp3031; }} 
  • Nginx 入门实战(1)--简介及安装
    本文介绍的 Nginx 为开源版本 Nginx,官网地址为:https://nginx.org/en/,如需了解商业版本,可访问商业版官网:https://www.nginx-cn.net/;文中所使用到的软件版本:Nginx 1.22.1、pcre 8.43、opnessl 1.1.1s、zlib 1.2.11、CentOS 7.9.2009。1、简介nginx [engine x] 是一款 Http 和反向代理服务器、邮件代理服务器和通用TCP / UDP 代理服务器。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。Nginx 可以在大多数 Unix Linux OS 上编译运行,并有 Windows 移植版。Nginx 具有如下功能。1.1、HTTP 基础功能 提供静态和索引文件服务,自动索引; 打开文件描述符缓存;通过缓存加速反向代理; 负载均衡和容错;通过缓存 FastCGI、uwsgi、SCGI 和 服务器来提高访问速度;负载均衡和容错;模块化架构。过滤器包括 gzipping、字节范围、分块响应、XSLT、SSI 和图像转换过滤器。如果由代理服务器或 FastCGI/uwsgi/SCGI 服务器处理请求,单个页面中的多个 SSI 可以并行处理;支持SSL和TLS SNI;支持基于权重和依赖的优先级的 HTTP/2。1.2、其他 HTTP 功能基于名称和 IP 的虚拟服务器;支持 Keep-alive 和管线化连接;访问日志格式、缓冲日志写入、快速日志轮换和 syslog 日志记录;3xx-5xx 错误代码重定向;重写模块:使用正则表达式更改 URI;根据客户端地址执行不同的功能;基于客户端 IP 地址、密码(HTTP基本认证)和子请求结果的访问控制;验证 HTTP Referer;PUT、DELETE、MKCOL、COPY 和 MOVE 方法;FLV 和 MP4 流媒体;响应速率限制;限制来自一个地址的并发连接或请求数量;基于 IP 的地理位置;A/B 测试;请求镜像;嵌入式 Perl;njs 脚本语言。1.3、邮件代理功能用户通过外部 HTTP 身份验证服务器重定向到 IMAP 或 POP3 服务器;使用外部 HTTP 身份验证服务器进行用户身份验证,并将连接重定向到内部 SMTP 服务器;认证方法:  POP3:USER/PASS、APOP、AUTH LOGIN/PLAIN/CRAM-MD5;  IMAP:LOGIN、AUTH LOGIN/PLAIN/CRAM-MD5;  SMTP:AUTH LOGIN/PLAIN/CRAM-MD5;SSL支持;STARTTLS 和 STLS支持。1.4、TCP/UDP 代理功能通用 TCP 和 UDP 代理;支持 SSL 和 TLS SNI 的 TCP;负载均衡和容错;基于客户端地址的访问控制;根据客户端地址执行不同的功能;限制来自一个地址的并发连接数量;访问日志格式,缓冲日志写入,快速日志轮换和 syslog 日志记录;基于 IP 的地理位置;A/B 测试;njs 脚本语言。2、安装2.1、下载源码nginx 源码:https://nginx.org/en/download.htmlpcre 源码:http://www.pcre.org/openssl 源码:https://www.openssl.org/source/zlib 源码:http://www.zlib.net/下载后解压:tar zxvf nginx-1.22.1.tar.gzunzip pcre-8.43.ziptar zxvf openssl-1.1.1s.tar.gztar zxvf zlib-1.2.11.tar.gz2.2、编译安装cd nginx-1.22.1./configure --prefix=/home/mongo/soft/nginx-1.22.1 --with-pcre=/home/mongo/installfile/pcre-8.43 --with-http_stub_status_module --with-http_ssl_module --with-openssl=/home/mongo/installfile/openssl-1.1.1s --with-zlib=/home/mongo/installfile/zlib-1.2.11 --with-mail --with-streammakemake install常用编译参数说明:更多参数说明可参考官网:https://nginx.org/en/docs/configure.html。2.3、启动Nginx 默认配置了一个端口为 80 Http 服务器,使用普通用户启动需要修改该端口;编辑 conf/nginx.conf 文件:http { include mime.types; default_type application/octet-stream; ... server { listen 8080; ...执行启动命令:sbin/nginx启动后访问 8080 端口:2.4、停止及重启sbin/nginx -s stop #停止sbin/nginx -s reload #重启2.5、sbin/nginx 命令详解使用 sbin/nginx -h 查看用法:nginx [-?hvVtTq] [-s signal] [-p prefix] [-e filename] [-c filename] [-g directives]参数说明:转载自https://www.cnblogs.com/wuyongyin/p/17282547.html