亚马逊免费云服务器领取与使用指南:
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。
以下是一些常见的原因和解决方法:
-
Gunicorn 或 Flask 应用程序崩溃或关闭了: 这可能是由于代码错误或配置问题导致的。请检查应用程序的日志文件以查看是否发生了任何错误,并尝试重新启动应用程序。
-
Nginx 配置错误: 请确保 Nginx 配置文件中的代理设置正确并指向正确的端口。
-
Gunicorn 配置错误: 请确保 Gunicorn 进程运行在正确的端口上,并且在启动时正确配置 workers 和 worker 类型。
-
系统资源耗尽: 如果服务器上的内存或 CPU 资源耗尽,则可能会导致 502 Bad Gateway。请考虑升级服务器或优化代码以降低资源消耗。
-
防火墙或代理阻止连接: 请确保服务器和客户端之间的连接未被防火墙或代理阻止。检查相关日志文件以获取更多信息。
总之,解决此问题的关键是定位错误所在。检查应用程序、Nginx、Gunicorn 和服务器配置以确保一切正常并正常运行。
个人遇见的是
问题1,gunicorn没有启动成功。此时可以检查日志文件。具体遇到了什么错误,没有办法启动成功。可能是变量未赋值便使用。肯定是有什么问题的。
2、在个人注册页面验证码无法发送成功,即邮箱填写没有问题,点了获取验证码,邮箱未收到验证码。
问题自己排查,主要通过日志。发现了celery运行写入日志与gunicorn写入日志冲突。可能由于gunicorn 与 celery 同时打开同一个日志文件,但是需要考虑日志写入的并发问题。由于这两个进程同时写入同一个文件,可能会导致文件锁定、数据丢失等问题。 这两个进程同时写入同一个文件,可能会导致文件锁定、数据丢失等问题。
Hayo AI给出的解决方案
为了避免这些问题,您可以考虑以下几个解决方案:
-
使用不同的日志文件:将 gunicorn 和 celery 的日志输出到不同的文件中,以避免并发写入问题。
-
使用不同的日志级别:使用不同的日志级别来过滤两个进程的日志,以便在调试时方便定位问题。例如,可以将 gunicorn 的日志级别设置为 INFO,将 celery 的日志级别设置为 DEBUG。
-
使用专业的日志方案:使用专业的日志方案来处理并发写入等问题,例如使用分布式日志系统或 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会话被关闭后,其与服务器之间的连接也被终止了。解决方法有两种:
-
使用附加功能或远程桌面连接:通过使用xshell的附加功能或者Windows远程桌面或其他类似的远程连接工具,您可以在关闭xshell会话后仍然继续保持与您的服务器的连接。
-
使用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进程时使用工具,例如nohup或systemd来将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 应用程序的启动顺序:
- 启动 Flask 应用程序,并使用 Gunicorn 在后台运行它:
gunicorn --workers=4 --bind=0.0.0.0:8000 myapp:app
- 启动 Celery 任务队列服务:
celery -A myapp.celery worker --loglevel=info
- 将 Nginx 配置文件中的 Flask 应用程序代理到 Gunicorn 进程:
location / {
# 加入负载均衡和请求超时配置等
proxy_pass http://127.0.0.1:8000;
}
nginx:sudo systemctl restart nginx.service 需要注意的是,启动顺序并不是绝对的,很多情况下可以根据具体需求进行调整。通常情况下,需要确保 Celery 和 Nginx 在 Flask 应用程序启动之前启动,以便 Flask 应用程序可以正确地使用它们。
5、如何结束进程
可以使用以下命令来结束这些进程:
- 查找进程ID:
ps -ef | grep gunicorn # 查找 gunicorn 进程的 ID
ps -ef | grep celery # 查找 celery 进程的 ID
ps -ef | grep nginx
- 结束进程:
kill -9 <进程ID> # 结束指定的进程
例如:
kill -9 1234 # 结束进程ID为1234的进程
3.ps ax|grep gunicorn
该命令的意思是:列出所有正在运行的进程,并在其中查找包含"gunicorn"字符的行。
这个错误意思是 Nginx 无法打开 /run/nginx.pid 文件。原因可能有几个:
-
权限问题:nginx 用户没有对 /run/nginx.pid 文件的写入权限。
-
文件不存在:实际上 /run/nginx.pid 文件不存在。
-
目录不存在:/run/ 目录不存在。
解决方案:
- 检查 /run/nginx.pid 文件是否存在,如果不存在就创建:
touch /run/nginx.pid
- 修改 /run/nginx.pid 文件的权限,让 nginx 用户有读写权限:
chown nginx:nginx /run/nginx.pid
- 修改 Nginx 配置,指定一个存在的 PID 文件:
pid /var/run/nginx.pid;
- 重新加载 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的配置,您可以按照以下步骤进行操作:
-
连接到您的亚马逊云服务器。可以使用SSH协议通过终端连接到服务器。例如,使用以下命令连接到服务器:
ssh 用户名@服务器IP地址其中
用户名是您在亚马逊云服务器上的用户名,服务器IP地址是云服务器的公共IP地址。 -
找到Nginx的配置文件。在Ubuntu系统中,默认的Nginx配置文件位于
/etc/nginx/nginx.conf。 -
使用文本编辑器打开Nginx配置文件。例如,您可以使用vi编辑器来编辑该文件:
sudo vi /etc/nginx/nginx.conf -
修改配置文件。在打开的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配置文件,以防意外情况的发生。
-
保存并退出配置文件。按照您使用的编辑器的要求,保存并退出Nginx配置文件。在vi编辑器中,按下
ESC键,然后输入:wq命令保存并退出。 -
检查Nginx配置文件的语法。确保您的修改没有引入任何语法错误。在终端中运行以下命令以验证配置文件:
sudo nginx -t如果配置文件语法正确,将显示提示信息;否则,将指出配置文件中的错误并给予相应的建议。
-
重新启动Nginx服务器。完成以上步骤后,使用以下命令重新启动Nginx服务器以使配置生效:
sudo systemctl restart nginx或者,如果您使用的是旧版本(1.9.2前)的Nginx,可以使用以下命令重新加载配置:
sudo /usr/sbin/nginx -s reload请记住,在重新启动或重新加载Nginx之后,您的配置更改才会生效。
这样,您就可以在亚马逊云服务器上的Ubuntu系统中修改Nginx的配置了。