【踩坑记】那一天,我摔倒在了Nginx上

记录一次Nginx使用的坑

情况描述

https甲方配置了已经绑定到我们8082端口了,Nginx如何配才能让自己的请求通过这个端口在本地无证书的情况下变成https。


使用环境

Docker安装最新版Nginx,并映射到各自的80端口,做好了文件映射

docker docker run -p 80:80 --name nginx --restart=always -v /opt/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/docker/nginx/conf.d:/etc/nginx/conf.d -v /opt/docker/nginx/html:/usr/share/nginx/html -v /opt/docker/nginx/logs:/var/log/nginx -d nginx


坑一

不论怎么配置80端口的代理,永远不生效,指定root目录后依旧是展示Nginx启动页,换了资源目录、配置全局root、换成alias都无效。以下是配置文件

```nginx 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;
#tcp_nopush     on;

keepalive_timeout  65;

#gzip  on;

include /etc/nginx/conf.d/*.conf;
root /user/share/nginx/html/buildingNavigationFront;
server{
    listen 80;
    listen  [::]:80;
    server_name 12;

    location / {
            root /usr/share/nginx/html/buildingNavigationFront;
            index index.html index.htm;
            add_header Content-Type "text/plain;charset=utf-8";
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST';
            #add_header X-Frame-Options ALLOWALL;
            #proxy_pass http://localhost:8081;
    }

}

}

```

然而,原因很简单

nginx include /etc/nginx/conf.d/*.conf;

这句话指定了一个默认配置文件,打开这个默认配置文件会发现它自己代理了80端口,所以你的配置会被他覆盖,永远无法生效。这其实是Docker的锅,他会自动把这个配置写进去,但是在服务器里直接yum安装Nginx是不会有这项默认配置的。


坑二

解决了坑一后,代理80端口转发到8082,指定访问8082端口返回的资源目录。重启Nginx,终于不是Nginx的启动页面了,变成了长时间未响应的错误信息返回页。呵呵了。

在把搜索引擎敲烂后,终于找到了原因。其实也很简单,但是也很容易疏忽。

如下图,由于Docker容器化部署的特性,使用Nginx代理并映射80端口后,转发到的是Nginx容器下的资源目录和端口,所以如果这个Nginx容器下的目录和配置文件的目录对不上,就会导致错误。此外,如果配置的目录在服务器而不在容器,就需要在nginx.conf把代理地址设置为服务器的公网ip地址,而不是localhost,否则会转发到容器里去。

img1.png


坑三

类似坑二,https甲方配置了已经绑定到我们8082端口了,但是代理之后通过80访问依旧无效。配置大概如下

```nginx server{ listen 80; servername localhost; location / { addheader X-Frame-Options ALLOWALL; proxypass http://localhost:8082/; } } server{ listen 8082; servername xxxxxxx.com; location / { root /user/share/nginx/html; index index.html index.htm;

}

}

```

坑二已经说过了,这是会转发到Nginx容器里去的,所以proxy_pass对应的地址应该是公网ip的8082端口,而不是localhost。

修改之后,依旧不行,此时已临近崩溃边缘。冷静下后,想到是说不定是防火墙的问题。

shell firewall-cmd --zone=public --list-ports

果然,列出的端口里没有80(明明之前开了)和8082。

shell firewall-cmd --add-port=80/tcp --permanent firewall-cmd --reload

打开端口之后在测试,大概率应该已经成功


自己的解决方案

为什么说大概率呢,因为到达那步之后,我依然没有达到目标,但是这时的配置我自己已经找不出逻辑上的问题了,可能是配置乱了。最后总结出一个结论,不要用Docker去安装代理类的中间件。我已经放弃使用Docker来部署Nginx了,最后干脆删除了整个Nginx容器。直接在本地部署Nginx。

本地部署完Nginx,安装编译后,打开/usr/local/nginx/conf/nginx.conf(默认路径),发现没有坑一说到的默认配置,舒服。配置好80端口和8082端口。

```nginx http { include mime.types; default_type application/octet-stream;

sendfile        on;

keepalive_timeout  65;

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass http://localhost:8082;
    }

}

server {
    listen       8082;
    server_name  xxxxxxx.com;
    # navigator是后端api的请求url
    location /navigator {
            proxy_pass http://localhost:8020;
    }
    location / {
        root /opt/docker/nginx/html;
        index index.html index.htm;
    }
}

} ```

访问https://xxxxxxx.com/资源目录

成功本地无证书配置https

img2.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值