将plotly绘图项目部署到阿里云服务器上



  • 该绘图项目是 用python的Dash或Flask开发Web应用

  • 该阿里云服务器的系统是ubuntu,自带的python版本是Python 3.10.12

  • 安装condawget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh 最后版本是conda 24.9.2



一、将项目放到服务器上


  1. 先建立一个文件夹,将项目文件放进去:

  • 这两个项目是python的Dash或Flask开发Web应用,Flask和Dash都自带一个简易的开发服务器。因此运行了py文件配置好端口即可访问。

  • 同时也可以用Nginx来部署和反向代理该Dash或Flask应用


注意:Flask和Dash虽然都自带一个简易的开发服务器,所以可以不用配置反向代理服务器。但是由于安全性和并发性等原因,自带的这些开发服务器适用于开发和测试环境,在生产环境中不建议直接使用因此,在生产环境中,通常会使用Nginx或其他类似的反向代理服务器来承担Web应用的访问控制、路由转发、性能优化等任务,而将Dash或Flask应用作为后端服务来运行。通过Nginx反向代理,可以提高Web应用的稳定性、性能和安全性。与java应用类似:在一个高效的 Web 应用架构中,通常会将 Nginx 放在前端,用于处理静态资源和进行反向代理、负载均衡,将 Tomcat 放在后端,用于处理 Java 动态请求。这样可以充分发挥两者的优势,构建一个高性能、高可用的 Web 应用系统。


二、HEROKU项目相关配置


    1. 先在阿里云后台上开放部分端口使得所有主机0.0.0.0都可以访问该服务器的这些端口,这里设置了8050-8060之间的所有端口,以及8001端口。
    1. 对于HEROKU项目,尝试使用Nginx来部署和反向代理,因此需要修改nginx.config配置文件,在/etc/nginx/目录下,添加一个server配置:
# 其他项目的配置信息
server {
        listen 80;
        server_name reaction.center;

        location / {
            root /shenao/dist;
            try_files $uri $uri/ /index.html;
        }

        location /shenao/dist {
            alias /shenao/dist;
            index index.html index.htm;
        }

	location /picturesH/ {
    		alias /shenao/pictures/picturesH/;
	}
	
	location /ethane_jpg/ {
    		alias /shenao/ethane_jpg/;
	}

	location /ethane_mp4/ {
    		alias /shenao/ethane_mp4/;
	}


        # error_page 404 /404.html;
        # location = /404.html {
        #     internal;
        # }

        # error_page 500 502 503 504 /50x.html;
        # location = /50x.html {
        #     internal;
        # }
    }
	

# 新增的	HEROKU项目的配置信息
	server {
    listen 80;
    server_name 120.26.44.100; # 还没有购买域名,所以用该服务器的公网ip代替

    location / { # 在该Nginx配置中,监听80端口并将请求代理到本地8050端口。
        proxy_pass http://localhost:8050;  # Dash/Flask 应用运行的端口 该端口要与py文件中的代码写的一致
        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;
    }

接着保存该文件,Ubuntu 的系统中,sudo service nginx reload这个命令会向 Nginx 主进程发送信号,让它重新读取配置文件。主进程会检查新配置文件的语法,然后重新加载配置,新的配置会应用到新的连接请求上,而不会中断正在处理的连接,如果还是不行则重启Nginx以应用更改。


    1. 运行结果如下:

图表没显示出来,原因是dash包和scipy包没有安装,因此pip install这两个包即可,重新运行后结果如下,运行正常:


注意:

通常情况下,如果要在同一个 IP 地址和端口(例如 80 或 443)上监听多个 server 块,必须通过不同的 server_name 来区分它们。例如,可以用域名或子域名来分别指定不同的应用

server {
    listen 80;
    server_name app1.example.com;

    location / {
        proxy_pass http://localhost:8000;  # 第一个应用的端口
    }
}

server {
    listen 80;
    server_name app2.example.com;

    location / {
        proxy_pass http://localhost:8001;  # 第二个应用的端口
    }
}


如果希望在同一服务器上同时运行多个项目,并且不想使用不同的域名或子域名,也可以指定不同的端口

server {
    listen 8000;  # 第一个应用的端口
    server_name localhost;

    location / {
        proxy_pass http://localhost:5000;  # 第一个应用
    }
}

server {
    listen 8001;  # 第二个应用的端口
    server_name localhost;

    location / {
        proxy_pass http://localhost:6000;  # 第二个应用
    }
}
# 在这个nginx配置中,listen 8001表示nginx在服务器本地监听 8001 端口。当有请求到达这个端口时,nginx会根据location块的配置来处理请求。

# location /表示匹配所有以/开头的请求路径。proxy_pass http://localhost:6000表示将匹配到的请求代理转发到本地的 6000 端口。

# 在浏览器(或者其他 HTTP 客户端)中应该输入http://公网ip:8001(而http://公网ip:6000很可能会因为没有6000端口的监听服务或者防火墙规则无法访问)

还有一种方法是:即使server_name相同且在同一个 IP 和端口监听,可以利用location指令来区分不同的项目网站

server {
    listen 80;
    server_name example.com;
    location /blog {
        proxy_pass http://backend_blog_server;
    }
    location /store {
        proxy_pass http://backend_store_server;
    }
}

# 当请求的 URL 是http://example.com/blog时,nginx会将请求转发到http://backend_blog_server;

# 当请求的 URL 是http://example.com/store时,nginx会将请求转发到http://backend_store_server。

其他方法:基于请求头(headers)区分,可以在前端设置自定义的请求头,然后在nginx配置中根据这个请求头的值来决定将请求转发到何处。具体操作百度或问AI




三、drawing_test项目配置



drawing_test项目不用nginx,而是直接运行,以便和上一个项目对比的效果,看看是用ngnix好还是用dash自带的web服务器效果好。



  1. 将drawing_test项目的代码中指定端口设置为8060和其他项目区分开来

  2. 新建一个conda虚拟环境,下好相关的包后,在虚拟环境中运行drawing_test项目:

  3. 前端页面如下:



四、同时运行这两个项目


想要在同一个conda虚拟环境中运行多个项目,可以使用tmux或者其他分屏工具,或者使用nohup命令指定项目的文件可以在后台运行,这里使用nohup命令来实现。


运行nohup python3 mydashapp.py > output_HEROKU.log 2>&1 &使得HEROKU项目在后台运行,并返回其pid


接着进入另一个项目的文件目录,运行nohup python3 drawing01.py > output_drawing.log 2>&1 &使得drawing_test项目也在后台运行,并返回其pid

此时还可以运行其他的项目,Conda虚拟环境本身并不会为其分配独立的内存空间。相反,它们直接使用计算机的物理内存;因此一个conda虚拟环境能运行多少个进程,主要取决于计算机的硬件资源、运行的项目对资源需求以及操作系统的特性。




posted @ 2024-10-28 22:10  卡卡发  阅读(94)  评论(0)    收藏  举报