Ubuntu开发工作

迟秋白 Lv2

ubuntu服务器开发配置

如果你不想每次登录服务器时输入密码,可以使用 SSH 密钥对进行无密码登录。以下是设置步骤:

新建用户组

在 Ubuntu 上使用其他用户账户创建一个新用户并赋予 sudo 权限,可以按照以下步骤操作:

步骤 1:登录到现有账户

首先,使用现有的具有 sudo 权限的账户登录到 Ubuntu 服务器。

步骤 2:创建新用户

使用 adduser 命令创建一个新用户。例如,创建一个名为 newuser 的用户:

1
sudo adduser newuser

系统会提示你输入新用户的密码和其他信息(如全名、房间号等)。你可以根据需要填写,或者按 Enter 跳过这些信息。

步骤 3:将新用户添加到 sudo 组

使用 usermod 命令将新用户添加到 sudo 组,以便赋予 sudo 权限:

1
sudo usermod -aG sudo newuser

步骤 4:验证新用户的 sudo 权限

切换到新用户并验证是否具有 sudo 权限:

1
su - newuser

然后尝试运行一个需要 sudo 权限的命令,例如更新包列表:

1
sudo apt update

系统会提示你输入新用户的密码。输入密码后,如果命令成功执行,则表示新用户已经具有 sudo 权限。

完整示例

以下是从头到尾的完整示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 登录到现有具有 sudo 权限的账户

# 创建新用户
sudo adduser newuser
# 系统会提示输入新用户的密码和其他信息

# 将新用户添加到 sudo 组
sudo usermod -aG sudo newuser

# 切换到新用户
su - newuser

# 验证 sudo 权限
sudo apt update
# 输入新用户的密码,确认命令是否成功执行

通过以上步骤,你可以在 Ubuntu 上使用现有账户创建一个新的用户,并赋予该用户 sudo 权限。确保你正确输入了新用户的密码,并且在执行 sudo 命令时使用新用户的密码进行验证。

免密码登录

步骤 1:生成 SSH 密钥对

在你的本地计算机上生成一个 SSH 密钥对。如果你已经有一个密钥对,可以跳过这一步。

1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

按照提示操作,这将生成一对公钥和私钥,默认保存在 ~/.ssh/ 目录下。生成密钥时可以按 Enter 键使用默认文件路径,并且可以选择不设置密钥密码。

步骤 2:将公钥复制到服务器

使用 ssh-copy-id 命令将公钥复制到服务器上的新用户账户。如果新用户账户名为 newuser,服务器地址为 your_server_ip

1
ssh-copy-id newuser@your_server_ip

这将提示你输入新用户的密码,并自动将公钥添加到服务器上的 ~/.ssh/authorized_keys 文件中。

步骤 3:验证无密码登录

现在你可以尝试无密码登录到服务器:

1
ssh newuser@your_server_ip

如果一切设置正确,你应该能够直接登录到服务器,而无需输入密码。

手动复制公钥(如果 ssh-copy-id 不可用)

如果没有 ssh-copy-id 命令,可以手动复制公钥到服务器。

  1. 在本地计算机上显示公钥内容:

    1
    cat ~/.ssh/id_rsa.pub
  2. 登录到服务器并创建 .ssh 目录(如果尚未创建):

    1
    2
    3
    ssh newuser@your_server_ip
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
  3. 编辑或创建 authorized_keys 文件:

    1
    nano ~/.ssh/authorized_keys
  4. 将本地计算机上显示的公钥内容复制到 authorized_keys 文件中,保存并关闭文件:

    id_rsa.pub 的内容粘贴到 authorized_keys 文件中。

  5. 设置合适的权限:

    1
    chmod 600 ~/.ssh/authorized_keys

完整步骤示例

  1. 在本地计算机上生成 SSH 密钥对:

    1
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  2. 将公钥复制到服务器:

    1
    ssh-copy-id newuser@your_server_ip
  3. 验证无密码登录:

    1
    ssh newuser@your_server_ip

通过这些步骤,你可以设置无密码登录到服务器,简化登录过程并提高安全性。确保妥善保管你的私钥,不要将其泄露给他人。

ubuntu服务器克隆github故障

小记——Linux下使用git clone总是失败 - 幻梦翱翔 - 博客园 (cnblogs.com)

1
git config --global url."https://".insteadOf git://

WSL和深度学习环境配置

【操作与配置】Linux的CPU深度学习环境-CSDN博客

报错:


可以参考激活Anaconda
在执行上述命令后,出现 conda: command not found 错误通常是因为 Miniconda 的路径没有正确添加到你的系统环境变量中。以下是一些可能的解决方法:

  1. 手动添加环境变量
    打开你的 .bashrc 文件,并确保以下内容添加到文件末尾:

    1
    export PATH="$HOME/miniconda3/bin:$PATH"

    然后保存文件并执行以下命令使其生效:

    1
    source ~/.bashrc
  2. 检查是否初始化了 bash
    在执行 ~/miniconda3/bin/conda init bash 后,确保你已经重新启动了终端窗口或者执行了 source ~/.bashrcsource ~/.bash_profile,以确保初始化的更改生效。

  3. 检查 Miniconda 安装路径
    确保你的 Miniconda 确实安装在 ~/miniconda3 目录下,这是你的 wget 命令下载并安装的路径。

  4. 重新安装 Miniconda
    如果以上步骤都没有解决问题,可以尝试重新安装 Miniconda,并确保在安装后按照上述步骤添加了环境变量。

请尝试这些步骤中的一种,并确保在每次更改后重新打开一个新的终端窗口以使更改生效。


超时报错:
pip命令后加-i https://pypi.tuna.tsinghua.edu.cn/simple
报错:

conda activate 报错 CondaError: Run ‘conda init‘ before ‘conda activate‘_condaerror: run ‘conda init’ before ‘conda activat-CSDN博客

在Ubuntu上安装Anaconda,可以按照以下步骤操作:

1. 下载Anaconda安装包

首先,前往Anaconda官网(Anaconda Downloads)下载适合Linux系统的Anaconda安装脚本。或者,您可以使用 wget 命令直接下载:

1
2
# 下载Anaconda最新版本的安装脚本
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

2. 验证下载的安装包

为了确保下载文件的完整性,可以验证文件的SHA-256校验和。首先,从Anaconda官网获取校验和,然后运行以下命令:

1
sha256sum Miniconda3-latest-Linux-x86_64.sh

3. 运行安装脚本

下载完成后,运行安装脚本:

1
bash Miniconda3-latest-Linux-x86_64.sh

4. 按照安装向导完成安装

运行安装脚本后,您会看到Anaconda安装向导。按照提示完成安装:

  1. 阅读并接受许可协议。
  2. 选择安装位置(默认为 ~/anaconda3)。
  3. 选择是否初始化Anaconda并修改您的 ~/.bashrc 文件。

5. 激活Anaconda

如果在安装过程中选择初始化Anaconda,则安装程序会自动修改您的 ~/.bashrc 文件,添加Anaconda的路径。如果没有选择初始化,您可以手动添加以下内容到 ~/.bashrc 文件:

1
2
# 在 .bashrc 文件末尾添加以下行
export PATH="$HOME/anaconda3/bin:$PATH"

然后,运行以下命令以使更改生效:

1
source ~/.bashrc

6. 验证安装

安装完成后,您可以运行以下命令来验证Anaconda是否安装成功:

1
conda --version

这将显示安装的Conda版本。

7. 更新Conda

最后,建议您更新Conda到最新版本:

1
conda update conda

通过以上步骤,您应该能够在Ubuntu上成功安装Anaconda。如果您有任何问题,请随时告诉我。

Windows Subsystem for Linux (WSL) 最新详细安装教程-CSDN博客
WSL1 和 WSL2 从C盘 导入到 D盘_wsl迁移到d盘-CSDN博客
WSL重置,打开就报错LocalState\ext4.vhdx‘找不到_wsl子系统ext4.vhdx打开报错:磁盘映像未初始化,包含无法识别的分区,或包含尚未分-CSDN博客
windows连接WSL-ubuntu里安装的MySQL,附安装教程_wsl ubuntu 如何连接 window上安装的数据库-CSDN博客
在windows下远程调用、连接(navicat)wsl2中 mysql 8.* 的详细步骤_wsl如何通过navicate连接mysql-CSDN博客
VS Code server for WSL closed unexpectedly check WSL terminal for more details_vs code server for wsl closed unexpectedly. check -CSDN博客

用户环境管理

是的,同时使用两个 Miniconda 安装是可行的,但需要一些配置来避免冲突。以下是一些步骤和注意事项,以便你可以在不同的上下文中使用这两个 Miniconda 安装:

1. 配置环境变量

确保每个 Miniconda 安装的路径都正确配置在不同的环境中,而不会相互干扰。

在用户环境中使用 Miniconda

  1. 编辑用户的 .bashrc.bash_profile 文件:
    1
    nano ~/.bashrc
  2. 添加以下内容来设置 Miniconda 环境变量:
    1
    export PATH="/home/dujiafeng/miniconda3/bin:$PATH"
  3. 保存并关闭文件,然后使更改生效:
    1
    source ~/.bashrc

在 root 环境中使用 Miniconda

  1. 编辑 root 的 .bashrc.bash_profile 文件:
    1
    sudo nano /root/.bashrc
  2. 添加以下内容来设置 Miniconda 环境变量:
    1
    export PATH="/root/miniconda3/bin:$PATH"
  3. 保存并关闭文件,然后使更改生效:
    1
    sudo source /root/.bashrc

2. 使用不同的环境文件

为确保在不同用户下使用不同的 Miniconda 环境,可以使用不同的环境文件来激活环境。

在用户环境中激活环境

  1. 确保你在用户环境下:
    1
    su - dujiafeng
  2. 激活环境:
    1
    2
    source ~/miniconda3/bin/activate
    conda activate <environment_name>

在 root 环境中激活环境

  1. 确保你在 root 环境下:
    1
    sudo su
  2. 激活环境:
    1
    2
    source /root/miniconda3/bin/activate
    conda activate <environment_name>

3. 创建别名以便切换

为了方便切换,可以在 .bashrc.bash_profile 文件中创建别名。

在用户环境中创建别名

  1. 编辑用户的 .bashrc 文件:
    1
    nano ~/.bashrc
  2. 添加别名:
    1
    alias user_conda="source ~/miniconda3/bin/activate"
  3. 保存并关闭文件,然后使更改生效:
    1
    source ~/.bashrc

在 root 环境中创建别名

  1. 编辑 root 的 .bashrc 文件:
    1
    sudo nano /root/.bashrc
  2. 添加别名:
    1
    alias root_conda="source /root/miniconda3/bin/activate"
  3. 保存并关闭文件,然后使更改生效:
    1
    sudo source /root/.bashrc

切换和使用

现在,你可以使用以下命令在用户和 root 环境中切换和使用 Miniconda:

  • 在用户环境中:

    1
    2
    user_conda
    conda activate <environment_name>
  • 在 root 环境中:

    1
    2
    sudo root_conda
    conda activate <environment_name>

通过这些步骤,你应该能够在不同的环境中使用两个 Miniconda 安装而不会互相干扰。如果有任何问题或需要进一步的帮助,请告诉我。

WSL Ubuntu22.04默认用户(default用户)更改_wsl ubuntu切换用户-CSDN博客
解决”wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理” - JustInCase - 博客园 (cnblogs.com)
【Linux】自定义WSL2安装位置,安装到其他磁盘(非C盘)_wsl2指定安装路径-CSDN博客

DATABASE

在 Ubuntu Server 22 中安装和配置 MongoDB (sjkjc.com)
在 WSL (Windows Subsystem for Linux) 中设置 MySQL 服务开机自启动可以通过修改 .bashrc 文件来实现。因为 WSL 没有完整的 systemd 服务管理系统,所以我们需要在用户登录时启动 MySQL 服务。

步骤1:编辑 .bashrc 文件

打开你的 .bashrc 文件:

1
nano ~/.bashrc

步骤2:添加启动 MySQL 服务的命令

在文件末尾添加以下命令,以便在每次打开 WSL 终端时启动 MySQL 服务:

1
2
# 启动 MySQL 服务
sudo service mysql start

这行命令将确保每次打开 WSL 终端时,MySQL 服务都会自动启动。

步骤3:保存并关闭 .bashrc 文件

Ctrl+O 保存文件,然后按 Ctrl+X 退出编辑器。

步骤4:重新加载 .bashrc 文件

重新加载 .bashrc 文件,使更改生效:

1
source ~/.bashrc

确认设置是否生效

关闭 WSL 终端并重新打开,或者重新启动 WSL,然后检查 MySQL 服务是否已启动:

1
sudo service mysql status

注意事项

由于 WSL 的设计特点,每次重启 Windows 或关闭 WSL 会停止所有服务。如果你希望在每次启动 WSL 时自动启动 MySQL,这种方法是有效的。然而,直接通过 .bashrc 文件管理服务可能会导致权限问题。为了解决这些问题,可以使用 sudo 配置不需要密码。

配置 sudo 以不需要密码(可选)

  1. 编辑 sudoers 文件:

    1
    sudo visudo
  2. 添加以下行(将 username 替换为你的 WSL 用户名):

    1
    username ALL=(ALL) NOPASSWD: /usr/sbin/service mysql start

这样可以确保在 .bashrc 文件中运行 sudo service mysql start 时不需要输入密码。

通过以上步骤,你可以设置 MySQL 服务在 WSL 启动时自动启动。请注意,这种方法适用于 WSL 环境,并且假设你可以修改 .bashrc 文件和 sudoers 配置。

nginx配置域名

如果您希望将http://47.98.121.213:8688的内容通过域名www.welltransai.com访问,那么您有两种选择:

  1. 使用端口80:将Nginx配置为监听80端口,并通过反向代理将请求转发到8688端口。这是最常见的做法,因为用户无需指定端口号,访问体验更好。

  2. 使用端口8688:直接在Nginx配置中使用8688端口,但用户需要在访问时指定端口号。

方案1:使用端口80并通过反向代理转发到8688

这是推荐的方案,可以让用户只需访问 http://www.welltransai.com,不需要指定端口号。

步骤 1: 编辑Nginx配置文件

  1. 打开Nginx虚拟主机配置文件

    1
    sudo vim /etc/nginx/sites-available/welltransai.com
  2. 添加以下配置,使用80端口并反向代理到8688端口:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    server {
    listen 80;
    server_name www.welltransai.com;

    location / {
    proxy_pass http://47.98.121.213:8688;
    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;
    }

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

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

步骤 2: 创建符号链接到sites-enabled目录

  1. 进入sites-enabled目录

    1
    cd /etc/nginx/sites-enabled/
  2. 创建符号链接

    1
    sudo ln -s /etc/nginx/sites-available/welltransai.com

步骤 3: 测试并重新加载Nginx配置

  1. 测试Nginx配置是否正确

    1
    sudo nginx -t
  2. 如果配置正确,重新加载Nginx

    1
    sudo systemctl reload nginx

步骤 4: 配置域名解析

  1. 登录到阿里云域名管理控制台
  2. **找到您的域名 www.welltransai.com**,并添加一条A记录,指向您的ECS实例IP地址(47.98.121.213)。

完成以上步骤后,用户可以通过 http://www.welltransai.com 访问您的静态网页。

方案2:直接使用8688端口

如果您决定直接使用8688端口,那么在Nginx配置中应设置为8688端口,但用户需要在访问时指定端口号。

编辑Nginx配置文件

  1. 打开Nginx虚拟主机配置文件

    1
    sudo vim /etc/nginx/sites-available/welltransai.com
  2. 添加以下配置,使用8688端口:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    server {
    listen 8688;
    server_name www.welltransai.com;

    location / {
    root /home/zhanyuan/html;
    index index.html index.htm;
    }

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

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

创建符号链接到sites-enabled目录

  1. 进入sites-enabled目录

    1
    cd /etc/nginx/sites-enabled/
  2. 创建符号链接

    1
    sudo ln -s /etc/nginx/sites-available/welltransai.com

测试并重新加载Nginx配置

  1. 测试Nginx配置是否正确

    1
    sudo nginx -t
  2. 如果配置正确,重新加载Nginx

    1
    sudo systemctl reload nginx

配置域名解析

  1. 登录到阿里云域名管理控制台
  2. **找到您的域名 www.welltransai.com**,并添加一条A记录,指向您的ECS实例IP地址(47.98.121.213)。

完成以上步骤后,用户可以通过 http://www.welltransai.com:8688 访问您的静态网页。

总结

推荐使用方案1,这样用户无需指定端口号,访问体验更好。方案2虽然简单,但需要用户每次访问时都指定端口号,不太方便。

数据标注

YOLO 算法的自定义数据集制作及模型训练方法(附代码)yolo格式数据集-CSDN博客
使用labelimg框图闪退报错(TypeError: arguments did not match any overloaded call)在以下三行改变 drawrect,drawline 的参数为 int-CSDN博客

flask上线

是的,Flask 是一个轻量级的 Python Web 框架,非常适合构建小型应用或 API。将 Flask 应用部署并通过外部访问涉及以下步骤:

1. 准备环境

首先,确保你已经安装了 Flask 及其依赖项。如果没有,可以通过以下命令安装:

1
pip install flask

2. 创建一个简单的 Flask 应用

这是一个简单的 Flask 应用示例:

1
2
3
4
5
6
7
8
9
10
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)

3. 运行 Flask 应用

在开发环境中,可以直接运行 Flask 应用:

1
python app.py

这会启动 Flask 服务器,默认在 localhost 的端口 5000 运行。

4. 配置外部访问

要使外部设备能够访问你的 Flask 应用,你需要将 host 参数设置为 0.0.0.0,这表示 Flask 应用将监听所有可用的网络接口,而不仅仅是本地回环接口。

1
2
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)

5. 配置防火墙和网络

确保你的服务器或主机的防火墙允许外部访问 Flask 应用所使用的端口(例如 5000)。在 Linux 系统中,可以使用 ufw 来打开端口:

1
sudo ufw allow 5000

如果你在云服务器上部署,如 AWS EC2,确保安全组允许端口 5000 的入站流量。

6. 使用生产级 WSGI 服务器

Flask 自带的开发服务器不适合生产环境。在生产环境中,你应该使用 WSGI 服务器(如 gunicornuWSGI)来运行 Flask 应用,并使用反向代理(如 Nginx)来处理请求。

例如,使用 gunicorn 运行 Flask 应用:

1
2
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:5000 app:app

这里,-w 4 表示使用 4 个工作进程,-b 0.0.0.0:5000 表示绑定到所有网络接口的 5000 端口。

7. 配置 Nginx 反向代理

配置 Nginx 反向代理是为了将外部的请求转发给你的 Flask 应用,从而实现更好的性能、安全性以及负载均衡。Nginx 是一个高性能的 HTTP 和反向代理服务器,在生产环境中常用来处理客户端请求,并将请求转发给应用服务器(如 Gunicorn)。

配置步骤:

1. 安装 Nginx

在大多数 Linux 发行版中,你可以通过包管理器来安装 Nginx。例如,在 Ubuntu 中,可以使用以下命令:

1
2
sudo apt update
sudo apt install nginx

安装完成后,你可以使用以下命令启动 Nginx:

1
sudo systemctl start nginx

你可以检查 Nginx 的状态以确保它正在运行:

1
sudo systemctl status nginx

2. 配置 Nginx 反向代理

接下来,你需要配置 Nginx,将它设置为反向代理服务器,使其将收到的请求转发给在 Gunicorn 上运行的 Flask 应用。

在 Nginx 配置目录中,通常位于 /etc/nginx/sites-available/,创建一个新的配置文件。例如,创建一个名为 flask_app 的配置文件:

1
sudo nano /etc/nginx/sites-available/flask_app

在文件中添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80; # 监听80端口(HTTP默认端口)
server_name your_domain_or_IP; # 将域名替换为你的域名或服务器的IP地址

location / {
proxy_pass http://127.0.0.1:5000; # 将请求转发到本地运行的Gunicorn服务器
proxy_set_header Host $host; # 保持原始的Host头
proxy_set_header X-Real-IP $remote_addr; # 保持客户端的IP地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 保持X-Forwarded-For头信息
proxy_set_header X-Forwarded-Proto $scheme; # 保持X-Forwarded-Proto头信息
}
}

解释:

  • listen 80: Nginx 将监听端口 80 上的所有请求,这通常是 HTTP 的默认端口。
  • server_name: 这是你的服务器的域名或 IP 地址,用于区分不同的虚拟主机。你可以用 your_domain_or_IP 替换为你实际的域名或服务器 IP。
  • location /: 这定义了根路径下的请求如何处理。/ 表示匹配所有路径。
  • proxy_pass: 这是最重要的指令,它告诉 Nginx 将匹配的请求转发到 http://127.0.0.1:5000,即在本地端口 5000 上运行的 Gunicorn 服务器。
  • proxy_set_header: 这些指令用来设置请求头信息,确保请求信息如客户端 IP 地址等能正确传递给后台服务器。

3. 启用配置

保存并关闭文件后,需要在 sites-enabled 目录中启用该配置。你可以通过创建符号链接实现这一点:

1
sudo ln -s /etc/nginx/sites-available/flask_app /etc/nginx/sites-enabled

然后,测试 Nginx 配置是否正确:

1
sudo nginx -t

如果没有错误,重启 Nginx 以应用新配置:

1
sudo systemctl restart nginx

4. 打开防火墙端口

确保防火墙允许 HTTP 流量(端口 80)。在 Ubuntu 中,可以使用 ufw 来允许 HTTP 流量:

1
sudo ufw allow 'Nginx Full'

5. 访问你的 Flask 应用

现在,你应该可以通过浏览器访问 your_domain_or_IP,Nginx 将处理请求并将其转发给在 Gunicorn 上运行的 Flask 应用。如果一切配置正确,你的应用应该可以通过外部访问。

总结:

通过配置 Nginx 反向代理,你可以让 Nginx 处理所有外部请求,并将这些请求转发给 Gunicorn 上运行的 Flask 应用。这样做的好处包括更好的性能(Nginx 高效处理静态内容)、增强的安全性(Nginx 作为第一道防线),以及支持更复杂的架构(如负载均衡、SSL 加密等)。

8. 使用域名访问(可选)

如果你有一个域名,可以将其指向服务器的 IP 地址,然后通过域名访问你的 Flask 应用。确保 DNS 记录已正确配置,并且 Nginx 配置文件中的 server_name 设置了正确的域名。

要保证 Flask 应用一直运行,通常会使用一个进程管理工具来管理和监控应用。supervisord 是一个常用的工具,可以自动启动、停止和重启应用程序。下面是使用 supervisord 来保证 Flask 应用一直运行的步骤。

1. 安装 Supervisord

在 Ubuntu 或 Debian 系统上,你可以使用以下命令安装 supervisor

1
2
sudo apt update
sudo apt install supervisor

2. 配置 Supervisord 来管理 Flask 应用

创建一个 supervisord 配置文件,来管理你的 Flask 应用。通常,这个配置文件位于 /etc/supervisor/conf.d/ 目录下。

创建并编辑配置文件,例如命名为 flask_app.conf

1
sudo nano /etc/supervisor/conf.d/flask_app.conf

在文件中添加以下内容:

1
2
3
4
5
6
7
8
9
[program:flask_app]
command=/path/to/your/venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 app:app
directory=/path/to/your/flask_app
autostart=true
autorestart=true
stderr_logfile=/var/log/flask_app.err.log
stdout_logfile=/var/log/flask_app.out.log
user=your_username
environment=PATH="/path/to/your/venv/bin"

解释:

  • command: 这是启动 Flask 应用的命令。在这里使用 gunicorn 来运行 Flask 应用,你需要将 /path/to/your/venv/bin/ 替换为你的虚拟环境路径,将 app:app 替换为你的 Flask 应用模块和实例名。
  • directory: Flask 应用的工作目录。将 /path/to/your/flask_app 替换为你 Flask 应用的路径。
  • autostart: 当 supervisord 启动时自动启动 Flask 应用。
  • autorestart: 如果 Flask 应用崩溃或被意外终止,supervisord 会自动重新启动它。
  • stderr_logfilestdout_logfile: 错误日志和标准输出日志的路径,可以帮助你监控应用运行状态。
  • user: 运行 Flask 应用的用户,将 your_username 替换为运行应用的用户。
  • environment: 用于设置 Flask 应用运行的环境变量,尤其是 PATH,确保 supervisord 能找到虚拟环境中的 gunicorn

3. 更新并启动 Supervisord

保存配置文件后,更新 supervisord 配置以加载新的服务:

1
2
sudo supervisorctl reread
sudo supervisorctl update

接着启动 Flask 应用:

1
sudo supervisorctl start flask_app

4. 检查应用状态

你可以使用以下命令查看 Flask 应用的状态:

1
sudo supervisorctl status flask_app

如果你修改了 Flask 应用的代码,通常需要重新启动 Flask 应用,以使更改生效。使用 supervisor 管理 Flask 应用时,有几种方法可以处理这种情况。

1. 使用 supervisor 重启 Flask 应用

你可以通过 supervisor 提供的命令来重启 Flask 应用,这样可以确保新的代码生效:

1
sudo supervisorctl restart flask_app

这将停止并重新启动 Flask 应用程序。flask_app 是你在 supervisor 配置中定义的程序名称。

2. 自动重启(选项)

如果你想让应用在代码更改时自动重启,可以使用 supervisorautorestart 选项。该选项已经在你之前的配置中设置为 true,即:

1
autorestart=true

然而,这个配置通常是应用程序崩溃时才会自动重启。如果你想让应用在代码更改时自动重启,需要配合 supervisorreloader 模式(Flask 内置的热加载机制)或使用其他工具(例如 watchdog)来监控文件变动并触发重启。

3. 使用 Flask 的 debug 模式(开发环境)

在开发环境中,您可以通过启用 Flask 的 debug 模式来自动重载代码。当代码发生更改时,Flask 应用会自动重新加载。你可以在运行 flask rungunicorn 时通过设置环境变量或在代码中启用 debug 模式。

1
2
if __name__ == '__main__':
app.run(debug=True)

4. 重新加载 gunicorn

如果你使用 gunicorn,也可以通过向 gunicorn 主进程发送信号来触发重载,而不需要完全重启 supervisor 服务。

1
kill -HUP <gunicorn_master_pid>

这种方法会平滑重启 gunicorn,使其加载新代码,而不影响当前连接的客户端。

5. 强制重启 supervisor 进程

作为最后的手段,你可以通过重启 supervisor 来重启所有由 supervisor 管理的服务:

1
sudo supervisorctl restart all

不过,这种方法会重启 supervisor 管理的所有进程,可能不是最优的做法。

supervisor 本身并不直接支持文件变更监控的重新加载功能,但是你可以通过以下几种方法来实现自动重载代码的功能,类似于 Flask 内置的 reloader 模式。

1. 使用 Flask 的 debug 模式

在开发环境中,你可以使用 Flask 的 debug 模式来实现自动重新加载。启用 debug 模式后,Flask 会监控项目中的文件变化,当代码发生变化时,应用会自动重新加载。

在 Flask 代码中,启用 debug 模式如下:

1
2
if __name__ == '__main__':
app.run(debug=True)

这种方法非常适合开发环境,但是不推荐在生产环境中使用,因为 debug 模式下的应用性能较差,且存在安全隐患。

2. 使用 gunicorn--reload 选项

在生产环境中,你可以使用 gunicorn 提供的 --reload 选项,该选项可以监控代码变化并自动重启服务器。这个方法和 Flask 的 debug 模式类似,但适用于生产环境。

配置 supervisor 使用 gunicorn--reload 选项,可以在配置文件中这样写:

1
2
3
4
5
6
7
8
9
[program:flask_app]
command=/path/to/your/venv/bin/gunicorn --reload -w 4 -b 0.0.0.0:5000 app:app
directory=/path/to/your/flask_app
autostart=true
autorestart=true
stderr_logfile=/var/log/flask_app.err.log
stdout_logfile=/var/log/flask_app.out.log
user=your_username
environment=PATH="/path/to/your/venv/bin"

3. 使用 watchdogwatchmedo 自动重启

watchdog 是一个 Python 库,用于监控文件系统事件。你可以使用 watchdog 的命令行工具 watchmedo 来监控代码变动并触发 supervisorctl restart

首先,安装 watchdog

1
pip install watchdog

然后,使用以下命令来监控文件变动并重启 supervisor 中的 Flask 应用:

1
watchmedo auto-restart --directory=./ --pattern=*.py --recursive -- supervisorctl restart flask_app
  • --directory=./: 指定要监控的目录,通常是你的 Flask 应用目录。
  • --pattern=*.py: 指定监控的文件模式,这里为 .py 文件。
  • --recursive: 递归监控子目录中的文件。
  • supervisorctl restart flask_app: 文件变动时要执行的命令,这里是重启 supervisor 管理的 Flask 应用。

你可以将这个命令写入到 supervisor 配置中作为一个独立的任务:

1
2
3
4
5
6
7
[program:flask_watcher]
command=watchmedo auto-restart --directory=/path/to/your/flask_app --pattern=*.py --recursive -- supervisorctl restart flask_app
autostart=true
autorestart=true
stderr_logfile=/var/log/flask_watcher.err.log
stdout_logfile=/var/log/flask_watcher.out.log
user=your_username

4. 使用 entr 工具

entr 是一个简洁的 UNIX 工具,用于监控文件系统的变化。可以通过以下方式使用:

1
ls *.py | entr supervisorctl restart flask_app

这将在当前目录下监控所有 .py 文件的变化,一旦发生变化,就会重启 Flask 应用。

5. 总结

  • 开发环境:使用 Flask 的 debug 模式或 gunicorn--reload 选项。
  • 生产环境:使用 watchdog(或 watchmedo)、entr 等工具与 supervisor 配合,自动监控代码变动并重启服务。

这些方法都能让你的 Flask 应用在代码变更后自动重启,确保最新的代码被立即应用。

  • 标题: Ubuntu开发工作
  • 作者: 迟秋白
  • 创建于 : 2024-06-07 09:21:53
  • 更新于 : 2025-05-04 18:03:29
  • 链接: https://chiqiubai.cn/2024/06/07/Ubuntu开发工作/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
Ubuntu开发工作