如何优化使用Nginx

news2024/12/27 11:11:03

文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 数据压缩
    • 负载均衡
      • 安装OpenResty或ngx_http_lua_module
      • 配置Nginx以启用Lua
      • 编写Lua脚本
      • 配置upstream块以使用Lua变量
      • 测试配置
    • 合并请求
      • 1. 确保SSI模块已启用
      • 2. 配置Nginx以使用SSI
      • 3. 使用SSI指令
      • 4. 重新加载或重启Nginx
    • 集成GEOip2 按地理位置分流
      • 安装GeoIP2模块
      • 下载GeoIP2数据库
      • 配置Nginx
      • 重新加载Nginx配置
    • limit rea限请求limit conn限连接limit rate限速
      • 1. 限制请求频率 (ngx_http_limit_req_module)
      • 2. 限制连接数 (ngx_http_limit_conn_module)
      • 3. 限速 (ngx_http_core_module)
    • 虚拟主机
      • 1. 打开Nginx配置文件
      • 2. 创建新的server block配置文件
      • 3. 编辑server block配置文件
      • 4. 启用server block
      • 5. 测试配置
      • 6. 重启Nginx
      • 7. 设置DNS和防火墙(如果需要)
    • 动静分离
      • 1. 部署静态资源
      • 2. 配置Nginx的server block
      • 3. 配置Java应用服务器
      • 4. 重启Nginx
    • 防盗链
      • 1. 识别防盗链请求
      • 2. 配置Nginx的server block
      • 3. 重启Nginx
    • url重写
      • 1. 简单的 URL 重定向
      • 2. 使用 rewrite 进行 URL 重写
      • 3. 基于条件的 URL 重写
      • 4. 永久重定向
    • nginx配置waf
      • 1. 使用 ModSecurity
      • 2. 使用第三方 WAF 解决方案
      • 3. 自定义 Nginx 配置增强安全性
  • 📢文章总结
  • 📥博主目标

🔊博主介绍

🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文专业写手、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、🚀徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。

📕拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙有过从0到1的项目高并发项目开发与管理经验,对JVM调优、MySQL调优、Redis调优 、ElasticSearch调优、消息中间件调优、系统架构调优都有着比较全面的实战经验。

📘有过云端搭建服务器环境,自动化部署CI/CD,弹性伸缩扩容服务器(最高200台),了解过秒级部署(阿里云的ACK和华为云的云容器引擎CCE)流程,能独立开发和部署整个后端服务,有过分库分表的实战经验。

🎥经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧,与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!


文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 数据压缩
    • 负载均衡
      • 安装OpenResty或ngx_http_lua_module
      • 配置Nginx以启用Lua
      • 编写Lua脚本
      • 配置upstream块以使用Lua变量
      • 测试配置
    • 合并请求
      • 1. 确保SSI模块已启用
      • 2. 配置Nginx以使用SSI
      • 3. 使用SSI指令
      • 4. 重新加载或重启Nginx
    • 集成GEOip2 按地理位置分流
      • 安装GeoIP2模块
      • 下载GeoIP2数据库
      • 配置Nginx
      • 重新加载Nginx配置
    • limit rea限请求limit conn限连接limit rate限速
      • 1. 限制请求频率 (ngx_http_limit_req_module)
      • 2. 限制连接数 (ngx_http_limit_conn_module)
      • 3. 限速 (ngx_http_core_module)
    • 虚拟主机
      • 1. 打开Nginx配置文件
      • 2. 创建新的server block配置文件
      • 3. 编辑server block配置文件
      • 4. 启用server block
      • 5. 测试配置
      • 6. 重启Nginx
      • 7. 设置DNS和防火墙(如果需要)
    • 动静分离
      • 1. 部署静态资源
      • 2. 配置Nginx的server block
      • 3. 配置Java应用服务器
      • 4. 重启Nginx
    • 防盗链
      • 1. 识别防盗链请求
      • 2. 配置Nginx的server block
      • 3. 重启Nginx
    • url重写
      • 1. 简单的 URL 重定向
      • 2. 使用 rewrite 进行 URL 重写
      • 3. 基于条件的 URL 重写
      • 4. 永久重定向
    • nginx配置waf
      • 1. 使用 ModSecurity
      • 2. 使用第三方 WAF 解决方案
      • 3. 自定义 Nginx 配置增强安全性
  • 📢文章总结
  • 📥博主目标

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。

💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

🥤本文内容

CSDN

数据压缩

在Nginx中配置数据压缩(通常是使用gzip压缩)可以有效地减少传输到客户端的数据量,从而提高网站的加载速度。以下是如何在Nginx中配置gzip压缩的步骤:

  • 打开Nginx配置文件:
    通常,Nginx的主配置文件位于/etc/nginx/nginx.conf,但你可能还需要编辑站点特定的配置文件,这些文件通常位于/etc/nginx/conf.d/或/etc/nginx/sites-available/目录中。

  • 添加或修改gzip指令:
    在http、server或location块中,你可以添加或修改以下gzip指令来启用压缩:

gzip on;  
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;  
gzip_proxied any;  
gzip_vary on;  
gzip_comp_level 6;  
gzip_buffers 16 8k;  
gzip_http_version 1.1;  
gzip_disable "MSIE [1-6]\.";

这些指令的含义如下:

  • gzip on;:启用gzip压缩。
  • gzip_types:指定哪些MIME类型应该被压缩。这里列出了一些常见的类型,但你可以根据需要添加或删除。
  • gzip_proxied any;:允许或禁止压缩代理的响应。any表示允许所有代理响应被压缩。
  • gzip_vary on;:在响应头中添加Vary: Accept-Encoding以通知代理缓存压缩和未压缩的版本。
  • gzip_comp_level 6;:设置压缩级别,从1(最快,最低压缩)到9(最慢,最高压缩)。6是一个常见的中间值。
  • gzip_buffers 16 8k;:设置用于压缩数据的缓冲区数量和大小。
  • gzip_http_version 1.1;:指定压缩响应所需的最低HTTP版本。
  • gzip_disable "MSIE [1-6]\.";:禁用对特定用户代理(如旧版Internet Explorer)的gzip压缩。
  1. 保存并关闭文件。
  2. 测试配置:
    在修改配置文件后,使用以下命令测试配置是否正确:
nginx -t

如果测试成功,你将看到“syntax is ok”和“test is successful”的消息。
5. 重新加载Nginx:
如果配置测试成功,你可以使用以下命令重新加载Nginx,使更改生效:

systemctl reload nginx

或者,根据你的系统和安装方式,你可能需要使用service命令或直接调用nginx可执行文件。

现在,Nginx应该已经配置为对符合条件的响应进行gzip压缩了。你可以使用浏览器的开发者工具或在线工具来检查响应头,确认是否启用了gzip压缩。

负载均衡

在Nginx中,你可以使用OpenResty或ngx_http_lua_module来集成Lua脚本,并通过Lua脚本来自定义负载均衡策略。OpenResty是一个基于Nginx与LuaJIT的Web平台,内置了ngx_http_lua_module,因此通常更推荐使用OpenResty来运行Lua脚本。

以下是如何在Nginx(或OpenResty)中使用Lua脚本来自定义分发请求的基本步骤:

安装OpenResty或ngx_http_lua_module

如果你还没有安装OpenResty,你需要先安装它。OpenResty已经内置了ngx_http_lua_module,所以你不需要单独安装。

如果你正在使用纯Nginx并希望添加ngx_http_lua_module,你需要重新编译Nginx并添加该模块。

配置Nginx以启用Lua

在你的Nginx配置文件中(通常是nginx.conf或站点特定的配置文件),你需要启用Lua模块并定义用于运行Lua脚本的位置。

http {  
    lua_shared_dict my_cache 128m;  
    lua_package_path '/path/to/your/lua/files/?.lua;;';  
      
    server {  
        listen 80;  
        server_name your.domain.com;  
          
        location / {  
            content_by_lua_block {  
                -- 在这里编写你的Lua代码  
            }  
        }  
    }  
}

注意lua_package_path指令,它指定了Lua脚本文件的搜索路径。

编写Lua脚本

在指定的Lua文件路径下,创建一个Lua脚本文件。在这个文件中,你可以编写自定义的负载均衡逻辑。例如,你可以根据请求的某些属性(如header、cookie或URI)来决定将请求转发到哪个后端服务器。

-- 假设你有一个后端服务器列表  
local upstreams = {  
    "backend1.example.com:80",  
    "backend2.example.com:80",  
    "backend3.example.com:80"  
}  
 
function select_upstream(request)  
    -- 根据你的自定义逻辑选择上游服务器  
    -- 例如,根据请求的header或URI  
    local upstream = upstreams[math.random(#upstreams)] -- 随机选择一个作为示例  
    return upstream  
end  
 
-- 获取选择的上游服务器,并转发请求  
local upstream = select_upstream(ngx.var.request_uri)  
ngx.var.upstream = upstream

配置upstream块以使用Lua变量

在Nginx配置中,你可以使用upstream块来定义后端服务器组。然后,在proxy_pass指令中使用Lua变量来动态选择上游服务器。

http {  
    lua_shared_dict my_cache 128m;  
    lua_package_path '/path/to/your/lua/files/?.lua;;';  
      
    init_by_lua_block {  
        -- 初始化Lua环境,加载Lua脚本等  
    }  
      
    upstream backend_servers {  
        server backend1.example.com:80;  
        server backend2.example.com:80;  
        server backend3.example.com:80;  
    }  
      
    server {  
        listen 80;  
        server_name your.domain.com;  
          
        location / {  
            set_by_lua_block $upstream_server {  
                return select_upstream(ngx.var.request_uri)  
            }  
              
            proxy_pass http://$upstream_server;  
        }  
    }  
}

注意set_by_lua_block指令,它用于设置一个Nginx变量,这个变量的值由Lua脚本计算得出。然后,proxy_pass指令使用这个变量来决定请求应该转发到哪个上游服务器。

测试配置

在修改配置文件后,重新加载或重启Nginx,然后测试你的自定义负载均衡策略是否按预期工作。

请注意,上述示例仅提供了一个基本的框架。根据你的具体需求,你可能需要更复杂的Lua逻辑来处理负载均衡。此外,对于生产环境,你还需要考虑性能优化、错误处理、日志记录等方面的问题。

合并请求

使用Concat模块合并客户端请求
https://www.nginx.com/resources/wiki/modules/concat/

使用SSI合并服务器端文件
http://nginx.org/en/docs/http/ngx_http_ssi_module.html

使用SSI(Server Side Includes)在Nginx中合并服务器端文件是一种在服务器端包含其他文件内容到HTML页面的技术。Nginx内置的ngx_http_ssi_module模块允许你使用SSI指令来包含其他文件的内容。以下是如何配置Nginx以使用SSI来合并服务器端文件的步骤:

1. 确保SSI模块已启用

首先,确保你的Nginx已经编译并包含了ngx_http_ssi_module模块。你可以通过运行nginx -V命令来检查已编译的模块列表。

2. 配置Nginx以使用SSI

在你的Nginx配置文件中(通常是nginx.conf或者特定站点的配置文件),你需要启用SSI并设置相关的指令。以下是一个简单的配置示例:

http {  
    # 开启SSI  
    ssi on;  
      
    # 设置SSI处理的MIME类型,默认为text/html和text/xml  
    ssi_types text/html;  
      
    server {  
        listen 80;  
        server_name your.domain.com;  
          
        root /path/to/your/webroot;  
        index index.html index.ssi;  
  
        location / {  
            # 这里可以添加其他配置指令  
        }  
  
        # 专门处理SSI文件的location  
        location ~ \.ssi$ {  
            ssi on;  # 如果全局未启用SSI,这里可以局部启用  
            include /etc/nginx/mime.types;  # 包含mime类型定义  
            add_header Content-Type text/html;  # 设置响应的Content-Type  
              
            # 其他的SSI相关配置可以放在这里  
        }  
    }  
}

在上面的配置中,我们定义了一个location块来处理以.ssi结尾的文件。这允许Nginx识别这些文件并应用SSI指令。注意,SSI通常用于.shtml文件,但在这个例子中,我们使用了.ssi作为文件扩展名,以避免与现有的.shtml文件混淆。你可以根据需要修改扩展名。

3. 使用SSI指令

在你的.ssi文件中,你可以使用SSI指令来包含其他文件的内容。例如:

<!--#include virtual="/path/to/header.html" -->  
<h1>Welcome to my website</h1>  
<!--#include virtual="/path/to/footer.html" -->

当Nginx处理这个.ssi文件时,它会将<!--#include virtual="/path/to/header.html" -->和<!--#include virtual="/path/to/footer.html" -->替换为对应文件的内容。

4. 重新加载或重启Nginx

修改配置文件后,你需要重新加载或重启Nginx以使更改生效。你可以使用以下命令之一:

sudo nginx -s reload  # 重新加载配置  
# 或者  
sudo systemctl reload nginx  # 如果你使用的是systemd

或者完全重启Nginx:

sudo systemctl restart nginx  # 如果你使用的是systemd

现在,当你访问一个.ssi文件时,Nginx将会应用SSI指令并合并服务器端文件的内容。

请注意,SSI是一种相对老旧的技术,并且可能不适合所有用例。在现代Web开发中,通常更推荐使用模板引擎和前端构建工具来实现类似的功能。SSI主要用于简单的Web页面和遗留系统。如果你的项目是一个新的Web应用,考虑使用更现代的工具和框架可能是一个好主意。

集成GEOip2 按地理位置分流

要在Nginx中集成GeoIP2并按地理位置分流,你需要遵循以下步骤:

安装GeoIP2模块

确保你的Nginx已经安装了ngx_http_geoip2_module。这个模块不是Nginx的默认模块,因此你可能需要从源码编译Nginx并包含这个模块。

如果你使用的是第三方Nginx包管理器(如nginx-extras),那么可能已经包含了GeoIP2模块。

下载GeoIP2数据库

你需要从MaxMind下载GeoIP2数据库。MaxMind提供了多种GeoIP2数据库,包括基于国家和城市的数据库。

访问MaxMind的官方网站并下载你需要的GeoIP2数据库。
https://www.maxmind.com/en/home

配置Nginx

在你的Nginx配置文件中,你需要加载GeoIP2模块并指定数据库的位置。以下是一个基本的配置示例:

http {  
    # 加载GeoIP2模块  
    load_module modules/ngx_http_geoip2_module.so;  
  
    # 设置GeoIP2数据库的路径  
    geoip2 /path/to/GeoLite2-City.mmdb {  
        $geoip2_data_country_code default=XX source=$variable_country;  
        $geoip2_data_city_name default=Unknown source=$variable_city;  
        # 可以添加更多变量,如经纬度等  
    }  
  
    server {  
        listen 80;  
        server_name your.domain.com;  
  
        location / {  
            # 使用if指令基于国家代码进行分流  
            if ($geoip2_data_country_code = US) {  
            # # 对来自美国的访问者的处理逻辑
                return 302 http://us.yourdomain.com$request_uri;  
            }  
            if ($geoip2_data_country_code = CN) {  
             # 对来自中国的访问者的处理逻辑
                return 302 http://cn.yourdomain.com$request_uri;  
            }  
            # 添加更多国家的分流逻辑  
  
            # 默认情况  
            root /path/to/your/webroot;  
            index index.html;  
        }  
    }  
}

在上面的配置中,我们首先加载了GeoIP2模块,并指定了GeoIP2数据库的路径。然后,我们创建了一个名为 g e o i p 2 d a t a c o u n t r y c o d e 的变量来存储国家代码,并设置了一个默认值 X X 。我们还创建了一个名为 geoip2_data_country_code的变量来存储国家代码,并设置了一个默认值XX。我们还创建了一个名为 geoip2datacountrycode的变量来存储国家代码,并设置了一个默认值XX。我们还创建了一个名为geoip2_data_city_name的变量来存储城市名称,并设置了一个默认值Unknown。

在server块中,我们根据$geoip2_data_country_code的值进行分流。如果访问者的国家代码是美国(US),我们将其重定向到us.yourdomain.com;如果是中国(CN),则重定向到cn.yourdomain.com。你可以根据需要添加更多国家的分流逻辑。

重新加载Nginx配置

保存你的Nginx配置文件后,重新加载Nginx以使配置生效:

sudo nginx -s reload

现在,Nginx将使用GeoIP2数据库根据访问者的地理位置进行分流。请确保你的GeoIP2数据库是最新的,并定期更新它以保持准确性。

limit rea限请求limit conn限连接limit rate限速

在Nginx中,你可以使用不同的模块来限制请求频率、连接数和传输速率。以下是如何配置这些限制的示例:

1. 限制请求频率 (ngx_http_limit_req_module)

要限制请求频率,你可以使用ngx_http_limit_req_module模块。这个模块用于限制来自单个IP地址的请求频率。

首先,你需要在http块中定义一个limit_req_zone指令来设置共享内存区域和键:

http {  
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;  
    ...  
}

这里的$binary_remote_addr用作键,mylimit是内存区域的名称,10m是内存区域的大小,rate=1r/s表示每秒只允许一个请求。

然后,在server或location块中使用limit_req指令来应用限制:

server {  
    ...  
    location / {  
        limit_req zone=mylimit burst=5 nodelay;  
        ...  
    }  
    ...  
}

burst=5表示允许超过限制速率的请求数在队列中等待处理,nodelay表示如果请求超过了限制速率,将立即返回503错误,而不是等待队列中的其他请求处理完毕。

2. 限制连接数 (ngx_http_limit_conn_module)

要限制连接数,你可以使用ngx_http_limit_conn_module模块。这个模块用于限制来自单个IP地址的并发连接数。

在http块中定义一个limit_conn_zone指令:

http {  
    limit_conn_zone $binary_remote_addr zone=addr:10m;  
    ...  
}

这里的$binary_remote_addr用作键,addr是内存区域的名称,10m是内存区域的大小。

然后,在server或location块中使用limit_conn指令来应用限制:

server {  
    ...  
    location / {  
        limit_conn addr 1; # 每个IP地址最多一个并发连接  
        ...  
    }  
    ...  
}

3. 限速 (ngx_http_core_module)

要限制传输速率,你可以使用ngx_http_core_module提供的limit_rate指令。这个指令限制每个连接的传输速率。

在server、location、if或limit_except块中使用limit_rate指令:

server {  
    ...  
    location / {  
        limit_rate 100k; # 限制每个连接的传输速率为100KB/s  
        ...  
    }  
    ...  
}

这里的100k表示每个连接的传输速率限制为100KB/s。

请注意,这些配置选项可能需要根据你的实际需求和服务器性能进行调整。在配置这些限制时,要确保不会意外地阻止合法用户的访问或导致服务器过载。建议在生产环境中应用这些配置之前先在测试环境中进行验证。

虚拟主机

在Nginx中配置虚拟主机(通常称为server blocks)允许你在同一台服务器上运行多个网站,每个网站可以有其自己的域名、根目录和配置设置。下面是如何配置Nginx虚拟主机的基本步骤:

1. 打开Nginx配置文件

通常,Nginx的主配置文件位于/etc/nginx/nginx.conf,但server blocks通常定义在/etc/nginx/sites-available/目录下的单独文件中,并通过符号链接到/etc/nginx/sites-enabled/目录来启用。

首先,打开主配置文件进行查看,确保包含了include /etc/nginx/sites-enabled/*;这样的指令,这样Nginx就会加载sites-enabled目录下的所有配置文件。

2. 创建新的server block配置文件

在/etc/nginx/sites-available/目录下创建一个新的配置文件,比如example.com:

sudo nano /etc/nginx/sites-available/example.com

3. 编辑server block配置文件

在打开的文件中,添加以下内容作为基本的server block配置示例:

server {  
    listen 80;  
    server_name example.com www.example.com;  
  
    root /var/www/example.com;  
    index index.html index.htm index.nginx-debian.html;  
  
    location / {  
        try_files $uri $uri/ =404;  
    }  
  
    # 其他location指令和配置...  
  
    # 日志配置  
    access_log /var/log/nginx/example.com.access.log;  
    error_log /var/log/nginx/example.com.error.log;  
}

在这个配置中:

listen 80; 表示这个server block监听80端口(HTTP默认端口)。
server_name example.com www.example.com; 定义了这个server block响应的域名。
root /var/www/example.com; 设置了网站的根目录。
index index.html index.htm index.nginx-debian.html; 定义了默认的索引文件顺序。
location / { … } 块中定义了URL如何映射到文件系统和如何处理请求。
access_log 和 error_log 指令定义了访问日志和错误日志的位置。

4. 启用server block

创建一个符号链接从sites-available到sites-enabled:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

5. 测试配置

在重启Nginx之前,先测试配置是否有误:

sudo nginx -t

如果没有错误消息,说明配置是正确的。

6. 重启Nginx

最后,重启Nginx使配置生效:

sudo systemctl restart nginx

或者在某些系统上:

sudo service nginx restart

7. 设置DNS和防火墙(如果需要)

确保你的DNS记录已经设置正确,将你的域名指向服务器的IP地址。此外,如果服务器配置了防火墙,确保80端口(或你使用的任何其他HTTP端口)是开放的。
注意事项:

确保/var/www/example.com目录存在并且Nginx进程有权限读取它。
如果你的网站需要HTTPS,你还需要配置SSL证书,并在server block中监听443端口。
如果你的网站需要处理PHP、Node.js或其他后端服务,你可能还需要安装和配置相应的模块和反向代理设置。
根据你的需求,可能还需要添加其他的location指令、重写规则、SSL配置等。

动静分离

在Nginx中配置Java应用的动静分离主要涉及将静态资源(如HTML、CSS、JavaScript、图片等)的请求直接由Nginx处理,而将动态请求(如Servlet、JSP等Java后端处理的请求)转发到后端的Java应用服务器(如Tomcat、Jetty等)。以下是如何实现这一配置的基本步骤:

1. 部署静态资源

首先,将你的静态资源部署到Nginx可以访问的目录。例如,你可以将静态资源放置在/var/www/html目录下。

2. 配置Nginx的server block

在Nginx的server block中,你需要定义两个主要的location块:一个用于处理静态资源,另一个用于转发动态请求到Java应用服务器。

下面是一个简单的示例配置:

nginx

server {  
    listen 80;  
    server_name example.com;  
  
    # 静态资源目录  
    location /static/ {  
        root /var/www/html;  
        # 可以添加更多的配置,比如缓存控制等  
    }  
  
    # 其他静态资源可以直接放在根目录下  
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {  
        root /var/www/html;  
        expires max;  
        log_not_found off;  
    }  
  
    # 动态请求转发到Java应用服务器  
    location / {  
        proxy_pass http://your_java_app_server; # 你的Java应用服务器的地址  
        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;  
    }  
  
    # 其他配置...  
}

在这个配置中:

location /static/ 块指定了所有以/static/开头的请求都应该从/var/www/html/static目录中提供静态文件。
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ 块是一个正则匹配,用于处理所有图片、CSS和JS文件的请求,这些文件通常也是静态的。
location / 块是一个捕获所有其他请求的通用块,它使用proxy_pass指令将所有请求转发到your_java_app_server,你需要替换成你的Java应用服务器的实际地址(例如http://localhost:8080)。
proxy_set_header指令用于设置转发到Java应用服务器的请求头,确保Java应用能够正确地处理这些请求。

3. 配置Java应用服务器

确保你的Java应用服务器(如Tomcat)已经正确配置,并且监听在Nginx配置中指定的端口上。如果你的Java应用需要处理session等敏感信息,确保配置了正确的跨域策略和安全设置。

4. 重启Nginx

保存配置文件后,重启Nginx使配置生效:

sudo systemctl restart nginx

或者在某些系统上:

sudo service nginx restart

注意事项:

确保Nginx和Java应用服务器之间的网络连接是通畅的,并且没有防火墙或其他网络策略阻止它们之间的通信。
如果你的Java应用服务器使用了HTTPS,确保在Nginx的配置中相应地配置SSL/TLS。
如果你的网站使用了HTTPS,你可能还需要配置Nginx作为反向代理来处理SSL/TLS终止,并将解密后的请求转发到Java应用服务器。
根据你的具体需求,可能还需要配置其他的Nginx指令,如重写规则、错误页面等。

防盗链

在Nginx中配置防盗链(Hotlink Protection)主要是为了防止其他网站直接链接到你的服务器上的资源,特别是图片、视频等静态资源,从而减轻服务器的带宽压力并保护内容不被滥用,虽然大部分场景都是使用云资源存储静态资源,但是某些特定场景还是需要自己存储的。以下是如何在Nginx中配置防盗链的基本步骤:

1. 识别防盗链请求

首先,你需要能够识别哪些请求是合法的,哪些请求是来自于其他网站并尝试直接链接到你的资源。这通常通过检查请求的Referer头部实现,合法的请求应该包含指向你网站的Referer。

2. 配置Nginx的server block

在Nginx的server或location块中,你可以添加防盗链的配置。以下是一个简单的示例配置:

server {  
    listen 80;  
    server_name example.com;  
  
    # 其他配置...  
  
    # 防盗链配置  
    location ~* \.(jpg|jpeg|png|gif|mp4|flv|swf)$ {  
        valid_referers none blocked example.com www.example.com;  
        if ($invalid_referer) {  
            return 403;  
        }  
    }  
  
    # 其他配置...  
}

在这个配置中:

location ~* .(jpg|jpeg|png|gif|mp4|flv|swf)$ 块指定了哪些文件类型应该受到防盗链保护。这里的正则表达式匹配了常见的图片和视频文件类型。
valid_referers 指令定义了哪些Referer头部是合法的。在这个例子中,none允许直接访问(没有Referer头部的情况,比如用户直接在浏览器中打开图片),blocked允许Referer头部被防火墙或代理服务器移除的情况,example.com和www.example.com则允许来自你网站的合法请求。
if ($invalid_referer) 块检查$invalid_referer变量,如果请求的Referer不是合法的,则执行return 403;指令,返回403 Forbidden错误。

3. 重启Nginx

保存配置文件后,重启Nginx使配置生效:

sudo systemctl restart nginx

或者在某些系统上:

sudo service nginx restart

注意事项:

防盗链配置可能会阻止合法的搜索引擎爬虫或合作伙伴访问你的资源,因此请确保你的配置不会过于严格。
有些用户可能会通过删除或伪造Referer头部来绕过防盗链,因此这只能作为一种基本的防护措施。
如果你的网站使用了CDN,你可能需要在CDN的配置中也进行相应的防盗链设置。
对于更高级的防盗链策略,你可能需要结合其他技术或工具,比如使用数字水印、内容加密等。

url重写

在 Nginx 中,你可以使用 rewrite 指令来实现 URL 重写功能。URL 重写通常用于简化 URL、优化 URL 结构、处理旧链接或实现某些特定的路由逻辑。

以下是一些基本的 Nginx URL 重写配置示例:

1. 简单的 URL 重定向

将 /oldpath 重定向到 /newpath:

server {  
    listen 80;  
    server_name example.com;  
  
    location /oldpath {  
        return 301 /newpath;  
    }  
  
    # 其他配置...  
}

2. 使用 rewrite 进行 URL 重写

server {  
    listen 80;  
    server_name example.com;  
  
    # 重写 /article/123 为 /articles/show/123  
    location /article/ {  
        rewrite ^/article/(.*)$ /articles/show/$1 last;  
    }  
  
    # 其他配置...  
}

在这个例子中,^/article/(.*)$ 是一个正则表达式,它会匹配所有以 /article/ 开头的 URL,并捕获括号内的部分(即数字或其他字符)。$1 是对第一个括号中捕获内容的引用,它会被替换到新的 URL 中。last 标志告诉 Nginx 停止处理当前 location 块的后续指令,并重新查找匹配的 location 块。

3. 基于条件的 URL 重写

你还可以使用 if 指令来根据特定条件进行 URL 重写:

server {  
    listen 80;  
    server_name example.com;  
  
    location / {  
        if ($http_user_agent ~* MSIE) {  
            rewrite ^(.*)$ /msie/$1 break;  
        }  
  
        # 其他配置...  
    }  
}

这个配置将针对使用 MSIE(Internet Explorer)浏览器的用户,将所有 URL 重写为 /msie/ 开头的 URL。~* 表示不区分大小写的正则匹配。break 标志会停止处理当前 location 块中的其他重写和重写模块指令。

4. 永久重定向

如果你希望进行永久重定向(即 HTTP 状态码 301),你可以使用 rewrite 和 redirect 指令的组合,或者简单地使用 return 指令:

server {  
    listen 80;  
    server_name example.com;  
  
    # 将所有不带 www 的 URL 重定向到带 www 的 URL  
    if ($host !~* ^www\.) {  
        rewrite ^(.*)$ http://www.example.com$1 permanent;  
    }  
  
    # 其他配置...  
}

在这个例子中,permanent 标志告诉 Nginx 发送一个 301 Moved Permanently 响应,告诉浏览器或客户端新的永久位置。
注意事项:

rewrite 指令在 server、location 和 if 块中都可以使用。
last、break、redirect 和 permanent 是 rewrite 指令的标志,它们决定了重写后的行为。
尽量避免在 location 块中使用 if 指令,因为它可能会导致不可预测的行为,尤其是在处理重写时。在大多数情况下,可以使用 map 指令或尝试重新组织你的 location 块来避免使用 if。
在进行 URL 重写时,请确保测试配置,以确保重写的 URL 是预期的,并且不会导致循环重定向或其他问题。

配置完成后,记得重新加载或重启 Nginx 以使配置生效。

nginx配置waf

在 Nginx 中配置 Web 应用防火墙(WAF)通常涉及到使用第三方的模块或集成现有的安全解决方案。Nginx 本身并不自带 WAF 功能,但可以通过一些插件和模块来增强安全性。以下是一些在 Nginx 中实现 WAF 的方法:

1. 使用 ModSecurity

ModSecurity 是一个开源的 WAF 模块,可以集成到 Nginx 中以提供实时的 web 应用保护。
安装 ModSecurity

首先,你需要安装 ModSecurity 和其 Nginx 连接器。这通常涉及到从源代码编译 Nginx,并启用 ModSecurity 模块。
配置 ModSecurity

安装完成后,你需要在 Nginx 配置文件中启用 ModSecurity,并定义一些规则。这些规则可以是自定义的,也可以是使用现成的安全规则集,如 OWASP ModSecurity Core Rule Set (CRS)。

示例配置可能如下:

http {  
    modsecurity on;  
    modsecurity_rules_file /path/to/modsecurity.conf;  
    ...  
}  
  
server {  
    listen 80;  
    server_name example.com;  
  
    location / {  
        modsecurity_rules;  
        ...  
    }  
}

在 /path/to/modsecurity.conf 文件中,你可以定义或包含 ModSecurity 规则。

2. 使用第三方 WAF 解决方案

除了 ModSecurity,还有一些商业和开源的 WAF 解决方案可以与 Nginx 集成,如 Cloudflare、Imperva、Incapsula 等。这些解决方案通常提供了一套完整的安全功能,包括 DDoS 防护、SQL 注入防护、跨站脚本攻击(XSS)防护等。

使用这些解决方案时,你通常需要将你的域名解析到 WAF 提供商的命名空间,并配置 WAF 以代理流量到你的 Nginx 服务器。

3. 自定义 Nginx 配置增强安全性

即使没有专门的 WAF 模块或解决方案,你也可以通过一些 Nginx 配置技巧来增强安全性:

限制访问频率和并发连接数,防止暴力破解。
使用 try_files 指令来避免直接访问敏感文件。
配置 HTTPS 并使用强加密套件。
配置正确的 HTTP 头部,如 X-Frame-Options, X-Content-Type-Options, X-XSS-Protection 等。
使用 map 指令和 if 指令来基于特定条件限制访问。

注意事项:

在配置 WAF 或任何安全增强措施时,务必进行充分的测试,以确保它们不会干扰正常的应用功能。
定期更新你的安全规则和 Nginx 版本,以应对新出现的威胁和漏洞。
监控和分析 WAF 的日志,以便及时发现和响应安全事件。

CSDN

📢文章总结

对本篇文章进行总结:

🔔以上就是今天要讲的内容,阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。

以梦为马,不负韶华

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

🚀🎉希望各位读者大大多多支持用心写文章的博主,现在时代变了,🚀🎉 信息爆炸,酒香也怕巷子深🔥,博主真的需要大家的帮助才能在这片海洋中继续发光发热🎨,所以,🏃💨赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD
  • 🎉微信号二维码SeniorRD

📥博主目标

探寻内心世界,博主分享人生感悟与未来目标

  • 🍋程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本是一个很普通的程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
  • 📺有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
  • 💥内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
  • 🎉这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我们必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。

🔔有需要对自己进行综合性评估,进行职业方向规划,我可以让技术大牛帮你模拟面试、针对性的指导、传授面试技巧、简历优化、进行技术问题答疑等服务。

可访问:https://java_wxid.gitee.io/tojson/

开发人员简历优化、面试突击指导、技术问题解答

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1523384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Maven入门篇】(2)IDEA集成Maven环境的具体操作

&#x1f38a;专栏【Maven入门篇】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The truth that you leave】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f354;配置Maven环境⭐方法一&#xff08;当前工程&…

选频网络与串联谐振回路

选频网络概述 在高频电子线路中&#xff0c;常以选频网络作为负载。选频网络能选出我们需要的频率分量和滤除不需要的频率分量。 选频网络分类&#xff1a; 1、振荡回路&#xff08;由L、C组成&#xff0c;也称谐振回路&#xff09;&#xff1a;包括单振荡回路、耦合振荡回路…

Java项目:58 ssm012医院住院管理系统+vue

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员&#xff1b;首页、个人中心、医护人员管理、科室管理、病人管理、病房管理、病人信息管理、病历管理、医嘱管理、手术安排管理、药品信…

【linux】搜索所有目录和子目录下的包含.git的文件并删除

一、linux命令搜索所有目录和子目录下的包含.git的文件 在Linux系统中&#xff0c;要搜索所有目录和子目录下的包含.git的文件&#xff0c;可以使用find命令。find命令允许指定路径、表达式和操作来查找文件。 以下是使用find命令搜索包含.git的文件的方法&#xff1a; 1. 基…

masm下载和配置

masm下载和配置 1&#xff09;masm32官网下载地址选择Austrlia 1。 2&#xff09;解压masm32v11r.zip,点击install.exe安装&#xff08;一直下一步即可&#xff09;。 3&#xff09;安装完成后得到一个masm文件夹。 4&#xff09;关联DOSBox与masm&#xff1a; 在DOSBox安…

Halcon识别文字案例

识别文字并显示到页面上 read_image (Image, needle1.png) * 打开窗口 dev_open_window (0, 0, 512, 512, black, WindowHandle) dev_display (Image)* 画矩形 gen_rectangle1 (ROI_0, 52.4648, 99.0391, 256.758, 354.063) * 裁剪 reduce_domain (Image, ROI_0, ImageReduced)…

InnoDB B+树索引

没有索引的查找 在一个页中的查找 假设目前表中的记录比较少&#xff0c;所有的记录都可以被存放到一个页中&#xff0c;在查找记录的时候可以根据搜索条件的不同分为两种情况&#xff1a; 以主键为搜索条件 这个查找过程我们已经很熟悉了&#xff0c;可以在页目录中使用二分法…

17双体系Java学习之数组的长度

数组的长度 //获取数组长度 arrays.lengthfor (int i 0; i <nums.length; i) {sum sum nums[i];}System.out.println("总和为&#xff1b;"sum);

【电机芯片】以STM32F103C8T6举例——持续更新

【电机芯片】以STM32F103C8T6举例——持续更新 文章目录 前言一、PWM二、IIC三、UART四、看门狗watchdog五、ADC六、定时器中断七、EEPROM与flash八、时钟九、IAP-Bootloader&#xff0c;APP十、OTA十一、GPIO模式十二、SPI十三、STLINK-DEBUG模式总结 前言 提示&#xff1a;以…

2024Vue高频面试题

前言: Vue 在前端开发领域拥有强劲的发展势头,以下是一些 Vue 的发展趋势: 1.持续增长的用户数量: Vue 作为一款轻量级、易学易用的前端框架,吸引了越来越多的开发者和企业选择使用。其活跃的社区和丰富的资源也促进了用户数量的不断增长。 2.生态系统不断丰富: 随着 V…

DC-1靶机渗透测试

DC-1靶机渗透测试 一、信息搜集1、嗅探寻找存活主机2、查找开放端口3、查找敏感目录 二、漏洞利用1、web访问2、寻找Drupal 的config文件3、寻找网站登录密码4、寻找靶机的用户名和密码5、远程登录6、提权 一、信息搜集 1、嗅探寻找存活主机 命令&#xff1a;arp-scan -l 找到…

Redis 三种集群方案

原文连接 : [Redis] 你了解 Redis 的三种集群模式吗&#xff1f; - 个人文章 - SegmentFault 思否 Redis 支持三种集群方案 主从复制模式Sentinel&#xff08;哨兵&#xff09;模式Cluster 模式 Redis 集群的三种模式 主从复制模式 主从复制的作用 通过持久化功能&#xff…

TypeScript -哲学 Mapped types

1、快速复制另一个类型 2、对之前的类型进行重写 3、 4、 注意&#xff1a;这里直接 报错&#xff1a;因为模版字符串只能包含 不能退出 k的来源&#xff0c;所以报错。 Remove a property from a type

C#,图论与图算法,寻找图(Graph)中的桥(Bridge)算法与源代码

1 图(Graph)中的桥(Bridge) 如果删除无向连通图中的边会断开该图的连接,则该边就是桥。对于断开连接的无向图,定义类似,桥接是一种边移除,它增加了断开连接的组件的数量。 与连接点一样,网桥代表连接网络中的漏洞,对于设计可靠的网络非常有用。例如,在有线计算机网…

C语言例:设 int a=11; 则表达式 a+=a-=a*a 的值

注&#xff1a;软件为VC6.0 代码如下&#xff1a; #include<stdio.h> int main(void) {int a11, b;b (aa-a*a); //a*a121 -->a-121结果为a-110 -->a-110结果为a-220printf("表达式aa-a*a 的值为&#xff1a; %d\n",b);return 0; } //优先级&#x…

C语言学习过程总结(18)——指针(6)

一、数组指针变量 在上一节中我们提到了&#xff0c;指针数组的存放指针的数组&#xff0c;那数组指针变量是什么呢&#xff1f; 显而易见&#xff0c;数组指针变量是指针 同样类比整型指针变量和字符指针变量里面分别存放的是整型变量地址和字符变量地址&#xff0c;我们可以…

linux查看top与修改root密码

top perf top -g -p 进程名 使用top命令&#xff0c;同时输入大写的P&#xff0c;会按照cpu使用率从大到小排列 linux修改用户登录密码 输入Ctrlx进入下面的界面 分别输入mount -o remount, rw / 注意rw后面又两个空格 输入passwd root 修改root密码 输入新密码2次 ex…

栈与队列|150.逆波兰表达式求值

力扣题目链接 class Solution { public:int evalRPN(vector<string>& tokens) {// 力扣修改了后台测试数据&#xff0c;需要用longlongstack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] "-&qu…

从政府工作报告探究计算机行业发展

从政府工作报告探计算机行业发展 政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&…

实现更高能效的汽车级低边驱动器NRVB140ESFT1G 带温度和电流限制 自保护低压侧驱动器

一起去了解关于汽车电子AEC Q101车规认证&#xff01;&#xff01;! 是一种针对分立半导体的可靠性测试认证程序&#xff0c;由汽车电子协会发布。这个认证程序主要是为了确保汽车电子产品在各种严苛的条件下能够正常工作和可靠运行。它包括了对分立半导体的可靠性、环境适应性…