使用nginx搭建通用的图片代理服务器,支持http/https/重定向式图片地址

该文章已生成可运行项目,

从http切换至https

许多不同ip的图片地址需要统一进行代理
部分图片地址是重定向地址

nginx配置

主站地址:https://192.168.123.100/

  • 主站nginx配置
server {
        listen       443 ssl;
        server_name  localhost;
        
        #ssl证书
        ssl_certificate ../ssl/ca.crt; 
        #私钥文件
        ssl_certificate_key ../ssl/ca.key; 
        ssl_session_cache shared:SSL:1m;                 
        ssl_session_timeout 5m;
        ssl_ciphers HIGH:!aNULL:!MD5; 
        ssl_prefer_server_ciphers on;
         
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /proxyAgent {
          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_intercept_errors on;
          if ($args ~* "imgUrl=(.*)") {
                proxy_pass $1;
                error_page 301 302 = @handle_redirect;
          }
        }
        location @handle_redirect {
                set $saved_redirect_location $upstream_http_location;
                rewrite ^(.*)$ $saved_redirect_location break;
                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 $saved_redirect_location;
        }
}
  • 主站html
<img src="/proxyAgent/?imgUrl=http://192.168.123.102:8093/test/123456?url=1234567&type=picpic">
<img src="/proxyAgent/?imgUrl=http://192.168.123.102/test/1.jpg">
<img src="/proxyAgent/?imgUrl=https://192.168.123.105/3.jpg">
  • 192.168.123.102:8093为java模拟重定向
@GetMapping("/{picId}")
    public void getPic(@PathVariable("picId") String picId,
                       @RequestParam("url") String url,
                       @RequestParam(value = "type") String type, HttpServletResponse response) throws IOException {
        if (StrUtil.isBlank(type)) {
            return;
        }
        if (StrUtil.isBlank(url)) {
            return;
        }
        System.out.println(type);
        System.out.println(url);
        response.sendRedirect("http://192.168.123.102/test/2.jpg");
    }

最终三张图片均可正常访问

在这里插入图片描述

本文章已经生成可运行项目
<think>我们正在配置Nginx的server块,特别是server_name指令,以支持多个域名和IP地址。根据Nginx官方文档,server_name指令用于设置虚拟服务器的域名或IP地址。它可以接受多个参数,用空格分隔。因此,我们可以这样配置:server_namedomain1.comdomain2.com192.168.1.1;其中,domain1.com和domain2.com是域名,192.168.1.1是IP地址。注意:在server_name中直接写IP地址是允许的,这样当客户端通过IP地址访问时,这个server块就会被匹配。另外,我们还可以使用通配符和正则表达,但这里我们只需要简单的多个域名和IP。参考引用[2]中提到了Nginx处理请求的细节,特别是关于server块和location块的配置,这有助于我们理解如何设置多个server_name。下面是一个示例配置:假设我们有两个域名:ngx.xxhf.cloud和example.com,以及两个IP地址:192.168.1.1和10.0.0.1。我们可以这样写:server_namengx.xxhf.cloudexample.com192.168.1.110.0.0.1;但是,需要注意的是,如果同时配置了域名和IP,那么当使用IP访问时,这个server块会被匹配,但可能证书问题(HTTPS)需要注意,因为SSL证书通常是绑定域名的,IP访问时可能会报证书错误。另外,引用[4]中提到了upstream配置,虽然和server_name没有直接关系,但提醒我们在配置反向代理时,如果涉及到多个后端服务器,可以使用upstream模块。步骤:1.打开Nginx配置文件(例如:/etc/nginx/conf.d/default.conf或/etc/nginx/sites-available/default)2.在server块中找到server_name指令,或者新建一个server块。3.在server_name后面列出所有要匹配的域名和IP,用空格分隔。4.保存并测试配置,然后重启Nginx。示例配置如下:```server{listen80;server_namengx.xxhf.cloudexample.com192.168.1.110.0.0.1;root/var/www/html;indexindex.htmlindex.htm;location/{try_files$uri$uri/=404;}}```如果还需要配置HTTPS,那么需要在另一个server块中监听443端口,并同样设置server_name,同时配置SSL证书。但注意:SSL证书通常只对域名有效,对IP地址无效。因此,当使用IP访问HTTPS时,浏览器会提示证书错误(除非有该IP的证书)。因此,一个常见的做法是:-为域名配置HTTPS,并设置server_name为域名。-另外设置一个server块监听443端口,server_name设置为IP地址,并使用一个通用的证书(或者重定向HTTP,或者使用自签名证书并让用户接受警告)。但是,如果我们希望同一个server块同时处理域名和IP的HTTPS请求,那么我们必须有一个证书同时覆盖这些域名和IP。这通常很难,因为公共证书很少为IP地址颁发(除非是内部CA)。因此,在实际操作中,我们可能更倾向于将IP访问的请求重定向HTTP,或者单独处理。不过,对于HTTP请求,我们可以同时处理域名和IP。总结:在server_name中同时添加域名和IP地址是可行的,但HTTPS下需要特别注意证书问题。现在,我们根据用户的需求,配置同时支持域名和IP的HTTP访问。注意:如果用户通过IP访问,那么Host头将是IP地址Nginx会根据server_name中的IP来匹配。重启Nginx服务:nginx-tsystemctlrestartnginx生成相关问题:1.如何配置Nginx以同时支持HTTPHTTPS?2.如何为多个域名配置SSL证书?3.当使用IP访问时,如何避免HTTPS证书错误?4.如何在Nginx中配置重定向,将IP访问重定向到域名?5.如何配置Nginx的默认服务器块(default_server)?</think>### Nginx配置`server_name`支持多域名和IP地址Nginx中配置`server_name`指令支持多个域名和IP地址,只需在配置文件中列出所有需要匹配的域名和IP,用**空格分隔**即可。以下是具体配置方法和示例: #### 配置方法 ```nginx server { listen 80; # 同时支持域名和多个IP server_name ngx.xxhf.cloud 192.168.1.100 10.0.0.200; root /var/www/html; index index.html; location / { try_files $uri $uri/ =404; } } ``` #### 关键要点 1. **多值支持** `server_name`可接受无限个参数: ```nginx server_name domain1.com domain2.com 192.168.1.100 10.0.0.200; ``` 2. **IP格要求** - 直接写IP地址(无需协议头) - 支持IPv4和IPv6: ```nginx server_name ngx.xxhf.cloud 192.168.1.100 2001:db8::1; ``` 3. **通配符匹配** 使用`*`匹配子域名或部分IP段: ```nginx server_name *.xxhf.cloud 192.168.1.*; # 匹配所有xxhf子域名和192.168.1.x网段 ``` 4. **默认服务器** 添加`default_server`标记处理未知Host头请求: ```nginx listen 80 default_server; server_name _; # 通配所有未匹配的请求 ``` #### 完整示例 ```nginx # 处理HTTP请求 server { listen 80; server_name ngx.xxhf.cloud 192.168.206.100; return 301 https://$host$request_uri; # 重定向HTTPS } # 处理HTTPS请求 server { listen 443 ssl; server_name ngx.xxhf.cloud 192.168.206.100; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; root /var/www/html; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass php:9000; # 引用[1]中的PHP容器 include fastcgi_params; } } ``` #### 验证步骤 1. **测试配置** ```bash nginx -t ``` 2. **重载服务** ```bash systemctl reload nginx ``` 3. **访问测试** ```bash curl http://ngx.xxhf.cloud curl http://192.168.206.100 curl https://ngx.xxhf.cloud ``` #### 注意事项 1. **HTTPS证书限制** - 商业证书通常不支持IP地址,需使用自签名证书或专业IP证书 - Let's Encrypt不支持纯IP证书[^1] 2. **容器网络配置** 在Docker环境中(如引用[1]): - 确保Nginx容器能解析后端服务(如`php:9000`) - 使用Docker DNS而非硬编码IP(避免引用[1]中的`192.168.206.100`问题) 3. **负载均衡场景** 结合引用[3][4],可在`upstream`中同时使用域名和IP: ```nginx upstream backend { server backend1.xxhf.cloud; server 192.168.206.101:8080 weight=2; } ``` --- ### 相关问题 1. 如何在Nginx中配置HTTPS重定向? 2. Docker容器间如何通过服务名通信而不用IP? 3. 如何为Nginx申请免费的SSL证书? 4. 如何实现Nginx的负载均衡和故障转移?[^3][^5] 5. 如何解决IP访问HTTPS时的证书错误问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值