openEuler下flask服务器环境搭建

Linux(openEuler) 下Flask开发环境搭建

Linux 本体

虚拟机安装[openEuler]]

使用Windows命令行ssh登录虚拟机内系统

ssh 用户名密码形式登录

ssh username@192.168.101.131

类似登录操作需要每次输入密码

使用ssh key登录

  1. 本地生成密钥文件

    ssh-keygen -t rsa

    这一步会在~/.ssh/目录下生成公钥和私钥文件

  2. ~/.ssh/下的公钥文件id_rsa.pub复制到远程服务器

ssh-copy-id -i ~/.ssh/id_rsa.pub miao@192.168.101.131
成功后, 可以在尝试登录, 现在就不需要输入密码了

vscode ssh登录

可能会遇到错误, tar命令不存在

sudo yum installl tar

连接后, 长时间显示正在连接, 可能需要再服务器修改一项设置

修改/etc/ssh/sshd_config文件, 取消对应行注释

AllowTCPForwarding yes

安装Python virtualenv虚拟环境

安装前配置国内pip源(可选)

pip.conf文件(使用阿里源, 大公司的速动更快一点)

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/

编辑环境变量文件, 设置环境变量PIP_CONFIG_FILE指向pip.conf文件

sudo vi /etc/profile.d/pip.sh
export PIP_CONFIG_FILE=/home/miao/.conf/pip.conf

uWsgi 安装与配置

uWsgi 安装过程没有太多坑, pip install uwsgi一般会遇到一些问题, 编译错误的根据提示下载gcc或者python3-dev之类的就可以解决

uWsgi 配置文件

[uwsgi]
#uwsgi启动时,所使用的地址和端口(这个是http协议的)
#http=0.0.0.0:5000
#指向网站目录
chdir=/home/miao/myexam/
#python 启动程序文件
wsgi-file=wsgi.py
#python 程序内用以启动的application 变量名
callable=app
#处理器数
processes=1
#线程数
threads=2
# uwsgi pid 号
pidfile=/home/miao/uwsgi/uwsgi.pid

# 重启的时候使用的 pid 号
touch-reload=/home/miao/uwsgi/uwsgi.pid

# unix socket和TCP socket配置, 在nginx可以使用这两个socket
socket=/home/miao/uwsgi/uwsgi.sock
socket=0.0.0.0:5000
chomod-socket=666

uWsgi 开机启动

添加配置文件/etc/systemd/system/uwsgi.service

[Unit]
Description=uwsgi
After=syslog.target

[Service]
Type=notify
ExecStart=/home/miao/.venv/myflask/bin/uwsgi --ini /home/miao/uwsgi/uwsgi.ini
ExecStop=/home/miao/.venv/myflask/bin/uwsgi --stop /home/miao/uwsgi/uwsgi.pid
ExecReload=/home/miao/.venv/myflask/bin/uwsgi --reload /home/miao/uwsgi/uwsgi.pid
User=miao
Group=miao
Restart=on-failure
KillSignal=SIGQUIT
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target

配置好后, 使用下面命令重新加载

sudo systemctl daemon-reload

启动uwsgi

sudo systemctl start uwsgi # 启动
sudo systemctl enable uwsgi # 开机自启
sudo systemctl stop uwsgi # 关闭

nginx 安装与配置

nginx 自身配置

sudo yum install nginx

安装一般没有太大问题

现在开启nginx服务

sudo systemctl start nginx

想要使服务开机自启, 可以使用下面命令

sudo systemctl enable nginx

现在可以在本机浏览器打开虚拟机服务器IP(比如192.168.101.131), 测试下是否安装成功

安装成功, 应该可以看到上述欢迎页面

如果打不开, 可能是防火墙问题, 为了测试方便, 可以关闭防火墙

sudo systemctl stop firewalld

nginx 代理uwsgi配置

Nginx中相应配置, 文件位置一般在/etc/nginx/nginx.conf:

http {
...
    upstream flask {
        # 使用uwsgi的unix socket接口进行通信
        server unix:///home/miao/uwsgi/uwsgi.sock;
        # server 0.0.0.0:5000;
    }

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        charset utf-8;

        location / {
            include uwsgi_params;
            # 指定上面的upstream
            uwsgi_pass flask;
        }

...
}

其他工具类配置

服务器使用Jupyter notebook/lab配置

1. 生成哈希密码

jupyter server password
[miao@localhost ~]$ jupyter server password
Enter password:
Verify password:
[JupyterPasswordApp] Wrote hashed password to /home/miao/.jupyter/jupyter_server_config.json

可以看到~/.jupyter/lab/jupyter_server_config.json文件中已经生产了hashed密码

2. 生成配置Jupyter配置文件

jupyter server --generate-config

可以看到~/.jupyter/lab/文件夹下生成了jupyter_server_config.py配置文件

修改允许的IP访问

## The IP address the Jupyter server will listen on.
#  Default: 'localhost'
c.ServerApp.ip = '*'

设置需要密码访问

## DEPRECATED in 2.0. Use PasswordIdentityProvider.password_required
#  Default: False
c.ServerApp.password_required = True

启动jupyter lab, 提示

[C 2023-10-11 10:16:43.692 ServerApp] Jupyter servers are configured to only be run with a password.
[C 2023-10-11 10:16:43.692 ServerApp] Hint: run the following command to set a password
[C 2023-10-11 10:16:43.692 ServerApp]   $ python -m jupyter_server.auth password

根据提示使用python -m jupyter_server.auth password命令生成密码

python -m jupyter_server.auth password
Provide password:
Repeat password:

生成密码后, jupyter_server_config.json文件中会生成对应的hash密码

"ServerApp": {
    "password": "argon2:$argon2id$v=19$m=10240,t=10,p=8$a4Fqaw5Q3cGewI0eBol7ig$C+0C8NB0DUX2uiMxCCt1e3IVb4yty28ZXgluDknrJGE"
}

此时, 再开启jupyter lab就可以使用密码访问了

3. 将Jupyter lab设置为服务项目, 并开机启动

/etc/systemd/system/文件下生成jupyter.service文件

sudo vi /etc/systemd/system/jupyter.service

文件内容如下:

[Unit]
Description=Jupyterlab
After=network.target
[Service]
Type=simple
ExecStart=/home/miao/.venv/exam/bin/jupyter-lab --config=/home/miao/.jupyter/jupyter_server_config.py --no-browser
User=miao
Group=miao
WorkingDirectory=/home/miao/myexam/
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

启动jupyter服务

sudo systemctl start jupyter

设置开机启动

sudo systemctl enable jupyter

关于system service无法读取自定义环境变量的问题

问题描述:

systemctl启动服务后, 无法读取/etc/profile.d/*sh中定义的环境变量

暂时解决办法:

修改uwsgi.servicejupyter.service描述文件

[service]部分添加EnvironmentFile=/etc/profile.d/exam.env指向新定义的环境变量文件

exam.env文件中环境变量定义应该使用key=value的形式, 例如

MAIL_USERNAME=admin@admin.com

Nginx服务器日志文件无法查看问题

nginx服务器日志默认路径: /var/log/nginx/
进入/var/log/, 可以看到nginx文件夹的所有者是用户nginx, 因为默认是nginx用户创建的, 可以通过nginx用户查看日志, 或者将nginx/文件夹的所有者改为当前用户

sudo chown miao -R /var/log/nginx

Nginx服务器上传文件失败

查看nginx日志文件:

2023/10/27 11:29:33 [crit] 13286#0: *1 open() "/var/lib/nginx/tmp/client_body/0000000001" failed (13: Permission denied), client: 192.168.101.1, server: _, request: "POST /add_chapters HTTP/1.1", host: "192.168.101.131"

可以看到Permission denied, 应该是权限问题, 这是因为上传到Nginx的文件要先保存在/var/lib/nginx/tmp/下, 查看后发现启动Nginx的用户无文件夹的读写权限

解决办法:

sudo chown miao -R /var/lib/nginx

将文件夹的所有者改为启动Nginx的用户

Git 服务器搭建与代码自动同步

需求: 在openeuler服务器上搭建git服务器, 每次push提交后, 代码会自动同步到项目文件夹

openEuler 上搭建git服务器

下载git

sudo yum install -y git

初始化git服务器目录

mkdir git
cd git
git init --bare myexam.git

现在git目录下面就有一个裸git仓库

现在在本机, 将本地项目代码关联到这个远程仓库

git remote set-url origin miao@192.168.1.169:~/git/myexam.git

查看远程仓库关联结果

$ git remote -v
origin  miao@192.168.1.169:~/git/myexam.git (fetch)
origin  miao@192.168.1.169:~/git/myexam.git (push)

然后, 将本地代码推送到远程服务器

git push

现在回到服务器, 将git仓库中的代码clone到我们需要打代码目录

git clone ~/git/myexam.git

设置git提交后代码自动同步

我们可以在服务器git仓库的hooks目录看到有许多可供调用的脚本文件, 这里我们使用post-update钩子, 里面是一些钩子文件的示例, 需要使用哪个, 就用去掉.sample后缀的格式

total 60
-rwxr-xr-x. 1 miao miao  478 Nov 18 10:52 applypatch-msg.sample
-rwxr-xr-x. 1 miao miao  896 Nov 18 10:52 commit-msg.sample
-rwxr-xr-x. 1 miao miao 4655 Nov 18 10:52 fsmonitor-watchman.sample
-rwxr-xr-x. 1 miao miao  189 Nov 18 10:52 post-update.sample
-rwxr-xr-x. 1 miao miao  424 Nov 18 10:52 pre-applypatch.sample
-rwxr-xr-x. 1 miao miao 1643 Nov 18 10:52 pre-commit.sample
-rwxr-xr-x. 1 miao miao  416 Nov 18 10:52 pre-merge-commit.sample
-rwxr-xr-x. 1 miao miao 1492 Nov 18 10:52 prepare-commit-msg.sample
-rwxr-xr-x. 1 miao miao 1374 Nov 18 10:52 pre-push.sample
-rwxr-xr-x. 1 miao miao 4898 Nov 18 10:52 pre-rebase.sample
-rwxr-xr-x. 1 miao miao  544 Nov 18 10:52 pre-receive.sample
-rwxr-xr-x. 1 miao miao 2783 Nov 18 10:52 push-to-checkout.sample
-rwxr-xr-x. 1 miao miao 3650 Nov 18 10:52 update.sample

我们来设置下post-update脚本, 这个钩子将会在代码提交后自动调用

vi ~/git/myexam.git/hooks/post-update

post-update 的内容

#!/bin/sh
# 打印输出
echo '======上传代码到服务器======'
# 打开线上项目文件夹
cd /home/miao/myexam
# 这个很重要,如果不取消的话将不能在cd的路径上进行git操作
unset GIT_DIR
git pull origin master
# 自动编译vue项目,如有需要请去掉前面的#号
# npm run build
# 自动更新composer(我暂时没试过)
# composer update
echo $(date) >> hook.log
echo '======代码更新完成======'

post-update 文件加上可执行权限

sudo chmod +x ~/git/myexam.git/hooks/post-update

现在可以提交代码, 测试下, 看是否可以同步

openEuler 下 PostgreSql 安装

1. 下载安装

sudo yum install postgresql-server

2. 数据库初始配置

sudo postgresql-setup --initdb

默认情况下pg已经默认创建了一个postgresLinux用户, 我们先为这个用户设置密码

sudo passwd postgres

设置完毕后切换到postgres用户登录系统

su - postgres 

修改pg数据库用户postgres的密码, 之后我们可以用这个密码来连接pg数据库

psql -d template1 -c "ALTER USER postgres WITH PASSWORD 'NewPassword';"

3. 配置PG数据库远程访问

修改配置文件/var/lib/pgsql/data/postgresql.conf文件

vi /var/lib/pgsql/data/postgresql.conf

文件内容如下:

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'          # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)
#unix_socket_directories = '/var/run/postgresql, /tmp'  # comma-separated list of directories
                                        # (change requires restart)
#unix_socket_group = ''                 # (change requires restart)
#unix_socket_permissions = 0777         # begin with 0 to use octal notation
                                        # (change requires restart)
#bonjour = off                          # advertise server via Bonjour
                                        # (change requires restart)
#bonjour_name = ''                      # defaults to the computer name
                                        # (change requires restart)

修改listen_addresses = '*'行, 监听所有IP, 并去掉注释

修改port = 5432, 可以更改端口号, 也可以不变, 但去掉前面注释

修改/var/lib/pgsql/data/pg_hba.conf 文件

vi /var/lib/pgsql/data/pg_hba.conf

修改PG的访问规则

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     all                                     peer
#host    replication     all             127.0.0.1/32            ident
#host    replication     all             ::1/128                 ident
host    all     all             0.0.0.0/0                 md5

注释掉原来的几条规则, 增加最后一行的规则

host    all     all             0.0.0.0/0                 md5

现在重启PG服务

sudo systemctl restart postgresql

重启后可以用navicat客户端等测试下连接是否可以成功