使用Blazor Docker容器的Nginx设置

kknvjkwl  于 2023-03-17  发布在  Nginx
关注(0)|答案(1)|浏览(233)

我已经创建了一个默认的blazor服务器应用程序,现在我想通过docker容器部署。
我的当前设置:

  • 使用Nginx配置的服务器如下(我按照说明安装了Nginxssl
server {
  root /var/www/mydomain/html;
  index index.html index.htm index.nginx-debian.html;

  server_name mydomain.net app.mydomain.net;

  location / {
          # try_files $uri $uri/ =404;
          proxy_pass                          http://172.18.0.23:443/;
          proxy_set_header Host               $host;
          proxy_set_header X-Real-IP          $remote_addr;
          proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;

  }

  listen [::]:443 ssl ipv6only=on; # managed by Certbot
  listen 443 ssl; # managed by Certbot
  ssl_certificate /etc/letsencrypt/live/app.mydomain.net/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/app.mydomain.net/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
  }

server {    
      if ($host = app.mydomain.net) {
          return 301 https://$host$request_uri;
      } # managed by Certbot
      listen 80;
      listen [::]:80;

      server_name mydomain.net app.mydomain.net;
      return 404; # managed by Certbot
}

然后,我在服务器上安装了Docker,上传了容器,并做了一些额外的设置,以确保我的容器有正确的IP根据我的Nginx配置文件:

sudo docker network create --subnet=172.18.0.0/16 mysubnet

然后我运行我的容器如下:

sudo docker run --hostname=ef93afb9ef97 --env=ASPNETCORE_URLS=https://+:443 --env=DOTNET_USE_POLLING_FILE_WATCHER=1 --env=ASPNETCORE_LOGGING__CONSOLE__DISABLECOLORS=true --env=ASPNETCORE_ENVIRONMENT=Development --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --env=DOTNET_RUNNING_IN_CONTAINER=true --env=DOTNET_VERSION=7.0.4 --env=ASPNET_VERSION=7.0.4 --workdir=/app --net mysubnet --ip 172.18.0.23 --restart=no  --runtime=runc -t -d blazortestapp:dev

注我删除了端口80,因为这会导致错误(VS生成的默认运行命令建议我们如下所示):

--env=ASPNETCORE_URLS=https://+:443;http://+:80

现在,当我ping我的ip www.example.com时127.8.0.23,我得到了一个答案,但是当我尝试访问我的示例应用程序时,我得到了一个
502错误网关
这里的陷阱是什么?是Nginx配置文件、Docker运行命令还是两者都有?

更新我删除了Docker subnet部件,并按如下方式连接端口:

sudo docker run [...] -p 8080:80 -p 8081:443 [...]

我还把地址设成了

proxy_pass https://127.0.0.1:8081/;

但我还是收到了严重的网关错误。

vs91vp4v

vs91vp4v1#

不要尝试对容器使用永久IP!!!
使用-p <host_port>:<application_port>运行你的容器。你的主机将侦听<host_port>并发送所有到此端口的请求到使用的容器应用<application_port>。然后将nginx配置更改为

proxy_pass http://127.0.0.1:<host port from docker run>/;

Nginx将发送请求到本地主机,本地主机的端口用于将请求发送到容器。
或者您可以使用docker-compose并设置两个服务:你的应用程序和nginx。都在容器中。而且它们可以通过服务名相互通信,而不需要IP。

相关问题