openEuler下flask服务器环境搭建
Linux(openEuler) 下Flask开发环境搭建
Linux 本体
虚拟机安装[openEuler]]
使用Windows命令行ssh登录虚拟机内系统
ssh 用户名密码形式登录
ssh username@192.168.101.131
类似登录操作需要每次输入密码
使用ssh key登录
本地生成密钥文件
ssh-keygen -t rsa
这一步会在
~/.ssh/
目录下生成公钥和私钥文件将
~/.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.service
和jupyter.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已经默认创建了一个postgres
Linux用户, 我们先为这个用户设置密码
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客户端等测试下连接是否可以成功