部署flask论坛项目到亚马逊免费云服务器,操作系统为ubuntu时运行中遇到的问题

354 阅读12分钟

亚马逊免费云服务器领取与使用指南:

1、领取zhuanlan.zhihu.com/p/589531053
2、使用blog.csdn.net/LYQ14005782…
3、领取视频教程:0.51 RXm:/ 【超详细】零基础也能够轻松白嫖(2台)亚马逊云VPS # 云服务器 # vps # 亚马逊云 # 甲骨文云 v.douyin.com/ijEnhRt/ 复制此链接,打开Dou音搜索,直接观看视频!

部署项目到云服务器遇到的问题

本篇博客汇总了在个人模仿《Flask Web全栈开发实战》里面的论坛项目时遇到的一些问题,个人项目最后上线地址(http://13.48.184.73/)
可能会有时访问不了,那可能自己在进一步完善。

1、flask项目运行时,碰到502 Bad Gateway 使用 Nginx、Gunicorn 和 Flask

Hayo AI给出的解决方案

502 Bad Gateway 是一种常见的服务器错误,意味着 Nginx 无法连接到 Gunicorn 或 Flask。

以下是一些常见的原因和解决方法:

  1. Gunicorn 或 Flask 应用程序崩溃或关闭了: 这可能是由于代码错误或配置问题导致的。请检查应用程序的日志文件以查看是否发生了任何错误,并尝试重新启动应用程序。

  2. Nginx 配置错误: 请确保 Nginx 配置文件中的代理设置正确并指向正确的端口。

  3. Gunicorn 配置错误: 请确保 Gunicorn 进程运行在正确的端口上,并且在启动时正确配置 workers 和 worker 类型。

  4. 系统资源耗尽: 如果服务器上的内存或 CPU 资源耗尽,则可能会导致 502 Bad Gateway。请考虑升级服务器或优化代码以降低资源消耗。

  5. 防火墙或代理阻止连接: 请确保服务器和客户端之间的连接未被防火墙或代理阻止。检查相关日志文件以获取更多信息。

总之,解决此问题的关键是定位错误所在。检查应用程序、Nginx、Gunicorn 和服务器配置以确保一切正常并正常运行。

个人遇见的是

问题1,gunicorn没有启动成功。此时可以检查日志文件。具体遇到了什么错误,没有办法启动成功。可能是变量未赋值便使用。肯定是有什么问题的。

2、在个人注册页面验证码无法发送成功,即邮箱填写没有问题,点了获取验证码,邮箱未收到验证码。

问题自己排查,主要通过日志。发现了celery运行写入日志与gunicorn写入日志冲突。可能由于gunicorn 与 celery 同时打开同一个日志文件,但是需要考虑日志写入的并发问题。由于这两个进程同时写入同一个文件,可能会导致文件锁定、数据丢失等问题。 这两个进程同时写入同一个文件,可能会导致文件锁定、数据丢失等问题。

Hayo AI给出的解决方案

为了避免这些问题,您可以考虑以下几个解决方案:

  1. 使用不同的日志文件:将 gunicorn 和 celery 的日志输出到不同的文件中,以避免并发写入问题。

  2. 使用不同的日志级别:使用不同的日志级别来过滤两个进程的日志,以便在调试时方便定位问题。例如,可以将 gunicorn 的日志级别设置为 INFO,将 celery 的日志级别设置为 DEBUG。

  3. 使用专业的日志方案:使用专业的日志方案来处理并发写入等问题,例如使用分布式日志系统或 ELK(Elasticsearch + Logstash + Kibana)来集中处理和管理日志。

请根据您的具体需求选择最适合您的解决方案。

自己解决方案

3、如何让亚马逊ubuntu的云服务器在xshell关闭之后仍然运行

sudo systemctl status nginx
sudo systemctl restart nginx.service

nohup gunicorn app:app &
nohup celery -A app.celery worker -l info &

如果您在运行Nginx、Gunicorn和Flask应用程序的亚马逊云服务器上设置了正确的IP地址和端口号,并且您已经启动了所有的服务,但您关闭xshell后就无法访问项目,可能是由于您的xshell会话被关闭后,其与服务器之间的连接也被终止了。解决方法有两种:

  1. 使用附加功能或远程桌面连接:通过使用xshell的附加功能或者Windows远程桌面或其他类似的远程连接工具,您可以在关闭xshell会话后仍然继续保持与您的服务器的连接。

  2. 使用nohup命令运行Gunicorn和Flask应用程序:nohup命令可以让您在关闭xshell会话后继续运行命令,例如:

$ nohup gunicorn --bind 127.0.0.1:8000 app:app &
或者
$ nohup gunicorn app:app &
nohup gunicorn app:app -e 'errorlog.log' > logfile 2>&1 &

这将启动Gunicorn和Flask应用程序,并将它们作为后台进程运行。在这种情况下,您不需要保持与服务器的连接或xshell会话。但是,请注意在此命令中使用“&”以确保此命令作为后台任务运行,而不会占用终端。

以上两种方法都可以确保您可以在关闭xshell会话后继续访问您的项目。但是,建议您使用SSH密钥对和其他安全措施来保护您的服务器。

如果您的亚马逊云服务器关闭或者您的SSH连接已经断开,Celery就会停止运行。

为了避免这种情况,您可以启动Celery worker进程时使用工具,例如nohupsystemd来将Celery worker作为一个守护进程运行。这样,在您关闭SSH连接或者服务器重启时,Celery worker仍将继续在后台运行。 例如,您可以使用以下命令来启动Celery worker:

nohup celery -A app.celery worker -l info &
在这个命令中,nohup命令将使Celery worker在后台运行,-A选项指定您的Flask应用程序的名称,worker参数告诉Celery worker执行任务,-l info参数将日志记录级别设置为INFO。- nohup: 表示在后台运行命令,即使关闭或退出终端,该命令也会继续运行。celery: 表示启动 Celery 命令。-A app.celery: 指定启动Celery时的应用程序实例,app.celery表示当前目录下的app.py中的celery实例。worker: 表示启动 Celery Worker 进程。-l info: 设置日志级别为 info 级别,可以输出更详细的日志信息。&: 表示将命令放入后台运行,这样可以在控制台中继续输入其他命令,而不需要等待该命令执行完毕。 或者 nohup gunicorn app:app -e 'errorlog.log' > logfile 2>&1 &

nohup celery -A app.celery worker -l info > logfile 2>&1 &

  • nohup: 使进程在当前用户退出时继续运行。gunicorn: Gunicorn是一个Python WSGI(Web服务器网关接口)HTTP服务器,用于部署Python应用程序。app:app: 指定Gunicorn运行的Flask程序实例,后面的两个app分别是Flask程序实例的变量名和应用程序的模块名。-e: 指定Gunicorn错误日志输出的位置。'errorlog.log': 指定错误日志文件名,这里为errorlog.log。> logfile: 将Gunicorn的正常输出重定向到logfile文件。2>&1: 将标准错误输出(stderr)重定向到与标准输出(stdout)相同的位置。&: 使进程在后台运行。

4、如何确定nginx、flask应用程序使用gunicorn作为应用服务器、celery、redis的启动顺序

顺序是redis必须在celery之前,是因为celery要连接redis。nginx、celery在flask之前。 以下是在生产环境中常用的 Flask 应用程序的启动顺序:

  1. 启动 Flask 应用程序,并使用 Gunicorn 在后台运行它:
gunicorn --workers=4 --bind=0.0.0.0:8000 myapp:app
  1. 启动 Celery 任务队列服务:
celery -A myapp.celery worker --loglevel=info
  1. 将 Nginx 配置文件中的 Flask 应用程序代理到 Gunicorn 进程:
location / {
    # 加入负载均衡和请求超时配置等
    proxy_pass http://127.0.0.1:8000;
}

nginx:sudo systemctl restart nginx.service 需要注意的是,启动顺序并不是绝对的,很多情况下可以根据具体需求进行调整。通常情况下,需要确保 Celery 和 Nginx 在 Flask 应用程序启动之前启动,以便 Flask 应用程序可以正确地使用它们。

5、如何结束进程

可以使用以下命令来结束这些进程:

  1. 查找进程ID:
ps -ef | grep gunicorn      # 查找 gunicorn 进程的 ID
ps -ef | grep celery        # 查找 celery 进程的 ID
ps -ef | grep nginx 
  1. 结束进程:
kill -9 <进程ID>            # 结束指定的进程

例如:

kill -9 1234   # 结束进程ID为1234的进程

3.ps ax|grep gunicorn
该命令的意思是:列出所有正在运行的进程,并在其中查找包含"gunicorn"字符的行。

这个错误意思是 Nginx 无法打开 /run/nginx.pid 文件。原因可能有几个:

  1. 权限问题:nginx 用户没有对 /run/nginx.pid 文件的写入权限。

  2. 文件不存在:实际上 /run/nginx.pid 文件不存在。

  3. 目录不存在:/run/ 目录不存在。

解决方案:

  1. 检查 /run/nginx.pid 文件是否存在,如果不存在就创建:
touch /run/nginx.pid
  1. 修改 /run/nginx.pid 文件的权限,让 nginx 用户有读写权限:
chown nginx:nginx /run/nginx.pid
  1. 修改 Nginx 配置,指定一个存在的 PID 文件:
pid /var/run/nginx.pid;
  1. 重新加载 Nginx 配置:
nginx -s reload

以上几个步骤你可以操作一下,首先检查是不是 /run/nginx.pid 文件不存在,然后创建文件、修改权限,修改 Nginx 配置指定其它 PID 文件,最后重新加载配置测试。

希望能为你解决这个 Nginx 错误。如果还有问题,欢迎继续提。

6、深夜收到亚马逊账单,如何别当大冤种

领取视频教程:0.51 RXm:/ 【超详细】零基础也能够轻松白嫖(2台)亚马逊云VPS # 云服务器 # vps # 亚马逊云 # 甲骨文云 v.douyin.com/ijEnhRt/ 复制此链接,打开Dou音搜索,直接观看视频!
这个视频里面有介绍,如何才能别被当个大冤种收费。个人是因为不知道有750个小时的限制,开了两个Linux实例,这个两个一起用只能用半个月,自己超出了免费额度,所以要花钱。还有自己开通了弹性ip。这个也要收费。
解决办法,关掉一个实例,同时释放弹性ip。

弹性ip介绍与作用

VPC(Virtual Private Cloud)是亚马逊虚拟私有云的意思。

简单来说,VPC能让您:

• 在亚马逊EC2云端创建逻辑隔离的虚拟网络。

• 在VPC内部署资源,就像在自己的数据中心一样。

• 控制网络边界,例如子网划分和路由表。

• 为资源分配公共IP或私有IP。

• 使用ACL、安全组、防火墙等网络安全功能。

VPC具有以下主要组成部分:

• 子网(Subnets):虚拟网络内的虚拟子网络,每个子网有自己的CIDR块。

• 路由表(Route Tables):决定子网内实例如何路由流量。

• 网络ACL(Network ACLs):控制子网内进入和离开

7、ip地址更换以后,如何让代理的nginx服务器也更改代理ip地址?

Hayo回答

要修改亚马逊云服务器上的Ubuntu系统中Nginx的配置,您可以按照以下步骤进行操作:

  1. 连接到您的亚马逊云服务器。可以使用SSH协议通过终端连接到服务器。例如,使用以下命令连接到服务器:

    ssh 用户名@服务器IP地址
    

    其中用户名是您在亚马逊云服务器上的用户名,服务器IP地址是云服务器的公共IP地址。

  2. 找到Nginx的配置文件。在Ubuntu系统中,默认的Nginx配置文件位于 /etc/nginx/nginx.conf

  3. 使用文本编辑器打开Nginx配置文件。例如,您可以使用vi编辑器来编辑该文件:

    sudo vi /etc/nginx/nginx.conf
    
  4. 修改配置文件。在打开的Nginx配置文件中,您可以修改各种Nginx的配置选项,如监听端口、虚拟主机、代理设置等。


Last login: Thu Jul 13 08:08:07 2023 from 117.159.181.194
ubuntu@ip-172-31-37-29:~$ cd "/home/zhiliao/zlckqa"
ubuntu@ip-172-31-37-29:/home/zhiliao/zlckqa$ vi /etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
       upstream app1{
            server 127.0.0.1:8000;
        }
        server {
                listen 80;
                ##主要修改这个代码
                server_name 13.48.184.73;
        location / {
           proxy_pass http://app1;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
 }

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;
                                                                                                                                 36,0-1        30%

注意:在进行修改之前,请确保备份原始的Nginx配置文件,以防意外情况的发生。

  1. 保存并退出配置文件。按照您使用的编辑器的要求,保存并退出Nginx配置文件。在vi编辑器中,按下ESC键,然后输入 :wq 命令保存并退出。

  2. 检查Nginx配置文件的语法。确保您的修改没有引入任何语法错误。在终端中运行以下命令以验证配置文件:

    sudo nginx -t
    

    如果配置文件语法正确,将显示提示信息;否则,将指出配置文件中的错误并给予相应的建议。

  3. 重新启动Nginx服务器。完成以上步骤后,使用以下命令重新启动Nginx服务器以使配置生效:

    sudo systemctl restart nginx
    

    或者,如果您使用的是旧版本(1.9.2前)的Nginx,可以使用以下命令重新加载配置:

    sudo /usr/sbin/nginx -s reload
    

    请记住,在重新启动或重新加载Nginx之后,您的配置更改才会生效。

这样,您就可以在亚马逊云服务器上的Ubuntu系统中修改Nginx的配置了。