安装Python3
sudo yum install -y lrzsz
cd /opt/dockerinstall
mkdir python3
准备相关的jar包 Index of /ftp/python/3.7.9/
scp Python-3.7.9.tgz root@bigdata42:/opt/dockerinstall/python3/
scp Python-3.7.9.tgz root@bigdata43:/opt/dockerinstall/python3/
yum -y install gcc
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
tar -zxvf Python-3.7.9.tgz
cd Python-3.7.9/
./configure --prefix=/usr/local/python3
make && make install
sudo ln -sf /usr/local/python3/bin/python3.7 /usr/bin/python3
sudo ln -sf /usr/local/python3/bin/pip3.7 /usr/bin/pip3
vim ~/.bashrc
添加
export PATH="/usr/local/python3/bin:$PATH"
source ~/.bashrc
安装PaddleNLP和PaddlePaddle
升级 pip3
/usr/local/python3/bin/python3.7 -m pip install --upgrade pip
升级libstdc++
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
发现少了GLIBCXX_3.4.20,解决方法是升级libstdc++
sudo yum provides libstdc++.so.6
cd /opt/dockerinstall/
sudo wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip
scp libstdc.so_.6.0.26.zip root@bigdata42:/opt/dockerinstall/
scp libstdc.so_.6.0.26.zip root@bigdata43:/opt/dockerinstall/
sudo yum install -y unzip unzip libstdc.so_.6.0.26.zip
cp libstdc++.so.6.0.26 /usr/lib64/
cd /usr/lib64/
ls -l | grep libstdc++
sudo rm libstdc++.so.6
sudo ln -s libstdc++.so.6.0.26 libstdc++.so.6
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
安装paddlenlp2.5.2
cd /opt/dockerinstall/
pip3 install paddlenlp==2.5.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
scp PaddleNLP.tar.gz root@bigdata42:/opt/dockerinstall/
scp PaddleNLP.tar.gz root@bigdata43:/opt/dockerinstall/
tar -zxvf PaddleNLP.tar.gz
cd /opt/dockerinstall/PaddleNLP/applications/text_classification/multi_class/deploy/simple_serving
安装paddlepaddle
pip3 install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install urllib3==1.26.18
nohup python3 -m uvicorn main_new:app --host 172.16.108.41 --port 6001 --workers 4 > paddlenlpweb_new.log 2>&1 &
nohup python3 -m uvicorn main_new:app --host 172.16.108.42 --port 6001 --workers 4 > paddlenlpweb_new.log 2>&1 &
nohup python3 -m uvicorn main_new:app --host 172.16.108.43 --port 6001 --workers 4 > paddlenlpweb_new.log 2>&1 &
nohup python3 -m uvicorn main_new:app --host 172.16.108.44 --port 6001 --workers 4 > paddlenlpweb_new.log 2>&1 &
tail -500f paddlenlpweb_new.log
测试:
curl -X POST http://172.16.108.41:6001/ -H 'Content-Type: application/json' -d '{"data":[{"text": "智能大屏"}, {"text": "智能销售"}]}'
curl -X POST http://172.16.108.42:6001/ -H 'Content-Type: application/json' -d '{"data":[{"text": "智能大屏"}, {"text": "智能销售"}]}'
curl -X POST http://172.16.108.43:6001/ -H 'Content-Type: application/json' -d '{"data":[{"text": "智能大屏"}, {"text": "智能销售"}]}'
curl -X POST http://172.16.108.44:6001/ -H 'Content-Type: application/json' -d '{"data":[{"text": "智能大屏"}, {"text": "智能销售"}]}'
使用 Systemd 管理服务
- 创建服务文件
注意要修改ip
[Unit]
Description=PaddleNLP Web Service
After=network-online.target
Wants=network-online.target
[Service]
User=paddlenlp_user
Group=paddlenlp_user
WorkingDirectory=/opt/dockerinstall/PaddleNLP/applications/text_classification/multi_class/deploy/simple_serving
ExecStart=/usr/bin/uvicorn main_new:app --host 172.16.108.44 --port 6001 --workers 4
Restart=on-failure
RestartSec=5s
Environment=PYTHONUNBUFFERED=1
StandardOutput=file:/data/dockerinstall/PaddleNLP/paddlenlpweb.log
StandardError=file:/data/dockerinstall/PaddleNLP/paddlenlpweb_error.log
Environment=PYTHONUNBUFFERED=1 # 确保 Python 输出实时写入(避免缓冲延迟)
MemoryLimit=512M
CPUQuota=80%
# 可选安全增强配置
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
注意 和 nginx在同一台服务器的端口号需要改为 6003
三、操作步骤(部署前必做)
1️⃣ 创建专用用户
mkdir -p /data/dockerinstall/PaddleNLP
sudo useradd -r -s /usr/sbin/nologin paddlenlp_user # 创建无登录权限的系统用户
sudo chown -R paddlenlp_user:paddlenlp_user /opt/dockerinstall/PaddleNLP # 确保用户有目录权限
sudo chown -R paddlenlp_user:paddlenlp_user /data/dockerinstall/PaddleNLP
cd /home
mkdir paddlenlp_user
sudo chown paddlenlp_user:paddlenlp_user /home/paddlenlp_user # 确保用户拥有其主目录 sudo chmod 755 /home/paddlenlp_user # 设置合理权限
sudo chown -R paddlenlp_user:paddlenlp_user /opt/dockerinstall/PaddleNLP
sudo chmod -R 755 /opt/dockerinstall/PaddleNLP
sudo chown -R paddlenlp_user:paddlenlp_user /data/dockerinstall/PaddleNLP
sudo chmod -R 755 /data/dockerinstall/PaddleNLP
sudo -u paddlenlp_user cat /proc/self/statm
安装 Uvicorn
pip3 install uvicorn[standard]
pip3 show uvicorn | grep Location
vim ~/.bashrc
添加
export PATH="/usr/local/python3/bin:$PATH"
export PATH="$PATH:~/.local/bin"
source ~/.bashrc
which uvicorn
配置日志轮转(防止日志无限增长)
创建 Logrotate 配置文件:
paddlenlpweb
sudo chown paddlenlp_user:paddlenlp_user paddlenlpweb
/data/dockerinstall/PaddleNLP/paddlenlpweb.log
/data/dockerinstall/PaddleNLP/paddlenlpweb_error.log {
daily # 按天轮转
rotate 30 # 保留最近30天日志
missingok # 文件不存在时不报错
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(避免与写入冲突)
notifempty # 空文件不轮转
create 0644 paddlenlp_user paddlenlp_user # 轮转后新建文件的权限和属主
}
touch paddlenlpweb.log
touch paddlenlpweb_error.log
netstat -tunple | grep 6001
sudo chown -R paddlenlp_user:paddlenlp_user /opt/dockerinstall/PaddleNLP
sudo chmod -R 755 /opt/dockerinstall/PaddleNLP
sudo chown -R paddlenlp_user:paddlenlp_user /data/dockerinstall/PaddleNLP
sudo chmod -R 755 /data/dockerinstall/PaddleNLP
先停止 6001端口的服务
部署服务
sudo cp paddlenlpweb.service /etc/systemd/system/
sudo cp paddlenlpweb /etc/logrotate.d/
sudo systemctl daemon-reload
sudo systemctl start paddlenlpweb
重启
sudo cp paddlenlpweb.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl restart paddlenlpweb
sudo systemctl status paddlenlpweb
停止服务
sudo systemctl disable paddlenlpweb
sudo systemctl stop paddlenlpweb
sudo rm /etc/systemd/system/paddlenlpweb.service
sudo systemctl daemon-reload
分析启动时序:
systemd-analyze verify /etc/systemd/system/paddlenlpweb.service
检查资源限制:
systemctl show paddlenlpweb --property=MemoryLimit,CPUQuota
sudo systemctl status paddlenlpweb
还是有异常
分步解决方案
1. 确认用户 paddlenlp_user
是否存在
id paddlenlp_user # 检查用户是否存在
- 若用户不存在,创建用户并指定主目录:
sudo useradd -m -d /home/paddlenlp_user paddlenlp_user # 自动创建主目录
2. 修复主目录权限
mkdir -p /home/paddlenlp_user
sudo chown paddlenlp_user:paddlenlp_user /home/paddlenlp_user # 确保用户拥有其主目录 sudo chmod 755 /home/paddlenlp_user # 设置合理权限
sudo chown -R paddlenlp_user:paddlenlp_user /opt/dockerinstall/PaddleNLP
sudo chmod -R 755 /opt/dockerinstall/PaddleNLP
sudo chown -R paddlenlp_user:paddlenlp_user /data/dockerinstall/PaddleNLP
sudo chmod -R 755 /data/dockerinstall/PaddleNLP
4. 检查系统文件访问兼容性
确保 /proc/self/statm
可读:
sudo -u paddlenlp_user cat /proc/self/statm # 验证用户权限
重启后:
curl -X POST http://172.16.108.44:6001/ -H 'Content-Type: application/json' -d '{"data":[{"text": "智能大屏"}, {"text": "智能销售"}]}'
测试也正常。
对nginx的配置修改如下:
# 定义词向量服务的upstream
upstream wordvec-backend {
server 172.16.108.44:6001 weight=1 max_fails=3 fail_timeout=10s; # 本地Nginx服务器的10011端口(若服务部署在Nginx本机)
server 172.16.108.43:6001 weight=1 max_fails=3 fail_timeout=10s;
server 172.16.108.42:6001 weight=1 max_fails=3 fail_timeout=10s; # 另一台服务器的10011端口
keepalive 32; # 保持长连接
least_conn; # 最少连接数负载均衡
}
# 词向量服务的独立监听端口
server {
listen 6001; # 监听外部请求的端口
server_name 172.16.108.41; # Nginx服务器IP或域名
location / {
proxy_pass http://wordvec-backend; # 转发到词向量后端
proxy_http_version 1.1;
proxy_set_header Connection ""; # 启用HTTP 1.1长连接
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;
# 超时时间设为20分钟(1200秒)
proxy_connect_timeout 120s; # 连接后端超时
proxy_read_timeout 120s; # 读取响应超时
proxy_send_timeout 120s; # 发送请求超时
}
}
sudo nginx -t
sudo nginx -s reload