无法通过Vagrant专用网络和端口转发(通过域名)访问Flask应用

时间:2020-06-28 21:29:24

标签: nginx flask vagrant ubuntu-18.04 portforwarding

我刚刚完成了一个Flask应用程序,该应用程序想通过虚拟机(使用Vagrant)在我的笔记本电脑上(在Ubuntu 18.04下)托管。

我的网络配置如下:

network configuration

我定义了一个域名(通过No-IP网站),我配置了Internet路由器进行端口转发(从80到8080,从443到8443),并添加了动态DNS来将域名链接到我的Internet路由器public IP地址。

命令host my_domain_name将我的互联网路由器的公共IP地址返回给我。

然后我创建了一个Vagrant专用网络(IP地址为192.168.33.10)和一个Vagrant端口转发:

Vagrant.configure("2") do |config|

  config.vm.box = "ubuntu/bionic64"
  config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true
  config.vm.network "forwarded_port", guest: 443, host: 8443, auto_correct: true
  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
  end
end

然后,我使用nginx + gunicorn +主管设置服务器(按照本教程说明https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvii-deployment-on-linux进行操作)。

我的nginx配置是:

server {
    # listen on port 80 (http)
    listen 80;
    server_name www.my_domain_name;
    location / {
        # redirect any requests to the same URL but on https
        return 301 https://$host$request_uri;
    }
}
server {
    # listen on port 443 (https)
    listen 443 ssl;
    server_name www.my_domain_name;

    # location of the self-signed SSL certificate
    ssl_certificate /home/vagrant/my_flask_app/certificates/certificate.pem;
    ssl_certificate_key /home/vagrant/my_flask_app/certificates/key.pem;

    # write access and error logs to /var/log
    access_log /var/log/my_flask_app_access.log;
    error_log /var/log/my_flask_app_error.log;

    location / {
        # forward application requests to the gunicorn server
        proxy_pass http://localhost:8000;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static {
        # handle static files directly, without forwarding to the application
        alias /home/vagrant/my_flask_app/app/static;
        expires 30d;
    }
}

我在VM上配置了防火墙,以便打开以下端口:

~$ sudo ufw satus

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443/tcp                    ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443/tcp (v6)               ALLOW       Anywhere (v6)   

对于主机(我的笔记本电脑):

~$ sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443/tcp                    ALLOW       Anywhere                  
8080/tcp                   ALLOW       Anywhere                  
8443/tcp                   ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443/tcp (v6)               ALLOW       Anywhere (v6)             
8080/tcp (v6)              ALLOW       Anywhere (v6)             
8443/tcp (v6)              ALLOW       Anywhere (v6)

当我在浏览器中尝试通过192.168.33.10访问该网站时,它运行正常。

但是当我尝试使用http://www.my_domain_name时,会显示欢迎使用nginx!页面。

我真的不明白我在做什么。

因为这是我第一次与网站托管打交道,所以很乐意得到任何帮助:-)

1 个答案:

答案 0 :(得分:0)

我认为您可能误解了专用网络的作用。当您有多个需要互相通信的VM时,这很有用,但在您的情况下则没有必要。有必要从VM内部进行监听的所有内容都监听0.0.0.0,而不是127.0.0.1。幸运的是,nginx已经做到了。

在笔记本电脑上(因为它较旧,所以运行Ubuntu 14.04),我使用以下方式配置了虚拟机

Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/bionic64"
    config.vm.network "forwarded_port", guest: 80, host: 8000

插入并安装了nginx。

我可以通过http://0.0.0.0:8000从笔记本电脑访问Nginx,也可以通过http://192.168.1.94:8000从Intranet上的其他地方访问。不必从VM内使用ufw(“ forwarded_port”会负责)。为什么ufw不需要这台笔记本电脑...可能取决于几年前我忘记做的事情。

在Intranet部分正常工作的情况下,将VM中的nginx(及其后面可能发生的替代物)暴露给互联网是路由器配置的问题。