目标是在kylin上部署一个Nginx服务器,用于为前端后端程序分配IP和端口。不过在实际使用时因为种种原因我先在centOS上进行了一下操作复现,过程比较顺利;接下来就在kylin系统进行了这个复现,过程同样顺利。
整个过程可以描述为:
Linux环境下创建venv虚拟环境,并测试虚拟环境中python+flask工程的运行状态;虚拟环境中通过pip安装和配置uwsgi,以及通过uwsgi启动python程序;安装Nginx以及测试Nginx的基本操作;最后进行整个项目的部署,通过Nginx配置后端程序以及静态文件以什么样的方式进行启动。
pip install pipenv #安装
pipenv shell #进入(创建)虚拟环境
exit #退出环境
pipenv --rm #删除整个环境
pipenv run python manage.py runserver #虚拟环境下运行
pip install virtualenv #安装
virtualenv py3env #创建名为py3env的虚拟环境
source py3env/bin/activate #启动虚拟环境
deactivate #退出虚拟环境
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.run()
mkdir /aips/aips-nxp-web-back/app/
touch /aips/aips-nxp-web-back/app/app.py
cd /aips/aips-nxp-web-back/app/
export FLASK_APP=app.py
flask run
即可启动这个程序,通过浏览器可以查看
需要在虚拟环境内安装uwsgi
source py3env/bin/activate #启动虚拟环境
pip install uwsgi #安装
常用命令:
# uwsgi --ini uwsgi.ini # 启动
# uwsgi --reload uwsgi.pid # 重启
# uwsgi --stop uwsgi.pid # 关闭
需要在web不输命令下新建:
touch uwsgi.ini
touch uwsgi.pid
touch uwsgi.log
touch uwsgi.status
启动python前,需要先对uwsgi.ini进行下编辑:
[uwsgi]
socket=127.0.0.1:8001
chmod-socket = 662
chdir = /aips/aips-nxp-web-back/app/
wsgi-file = app.py
callable = app
master = true
processes = 4
virtualenv = /aips/aips-nxp-web-back/py3env/
vacuum = true
说明:
[uwsgi]
socket=127.0.0.1:8001 #并非 flaskrun的端口,而是内部tcp通讯的端口
chmod-socket = 662
chdir = /aips/aips-nxp-web-back/app/ #指定工程目录
wsgi-file = app.py #指定工程文件
callable = app #app = Flask(__name__),这里的app
master = true
processes = 4
virtualenv = /aips/aips-nxp-web-back/py3env/ #指定应用的虚拟环境
vacuum = true
通过ini文件的方式启动
uwsgi --ini uwsgi.ini
下载:nginx.org/en/download.h
安装前需要必要环境:
yum install gcc-c++
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
安装:
tar zxvf nginx-1.22.0.tar.gz
cd /nginx-1.22.0
./configure
make && make install
在kylin系统采用的是直接安装Nginx的方式,这里安装时会自动安装好相关的依赖环境。
yum inxtall nginx
我的Nginx安装时的位置是 /usr/local/nginx/sbin/nginx
如果要查找nginx程序位置通过指令:
find / -name nginx
Nginx的强行停止命令: # /usr/local/nginx/sbin/nginx-s stop
Nginx的优雅停止命令: # /usr/local/nginx/sbin/nginx -s quit // 优雅停止,是等最后一次交互执行完再停止。
Nginx检查配置文件是否有错: #/usr/local/nginx/sbin/nginx -t
Nginx的重新加载命令: # /usr/local/nginx/sbin/nginx -s reload
查看Nginx版本: # /usr/local/nginx/sbin/nginx -v
查看Nginx详细版本: #/usr/local/nginx/sbin/nginx -V
添加Nginx环境变量
vi /etc/profile
# 在该文件添加
export PATH=/usr/local/nginx/sbin/:$PATH
# 添加的新环境变量需要用:隔开
# 添加完后执行:
source /etc/profile
# 可以令环境变量生效
以后执行启动和停止nginx就不需要指定位置信息了
nginx path prefix: "/usr/local/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx error log file: "/usr/local/nginx/logs/error.log"
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
server {
listen 8002;
server_name 192.168.8.124;
charset utf-8;
location /static {
alias /aips/aips-nxp-web-back/static;
}
client_max_body_size 75M;
location /{
uwsgi_pass 127.0.0.1:8001;
include /aips/aips-nxp-web-back/uwsgi_params;
}
}
}
重点说的只有最后的部分:
server {
listen 8002; #指定监听端口
server_name 192.168.8.124; #局域网内的固定IP
charset utf-8;
location /static { #指定静态文件的处理方式是由Nginx自身完成,static是一个路由
alias /aips/aips-nxp-web-back/static; #/static对应的静态文件路径
}
client_max_body_size 75M;
location /{ #这里的location指定的是动态文件的路由,以及动态文件需要取找uwsgi的tcp端口传送,
uwsgi_pass 127.0.0.1:8001; #指定uwsgi的tcp端口,与uwsgi.ini中的socket是对于的
include /aips/aips-nxp-web-back/uwsgi_params; #指定uwsgi
}
}
注:这里include /aips/aips-nxp-web-back/uwsgi_params;中的uwsgi_params文件对应的是安装nginx后在/etc/nginx下的,指定了uwsgi的配置
需要执行:
cp /etc/nginx/uwsgi_params /aips/aips-nxp-web-back/app/
[uwsgi]
socket=127.0.0.1:8001 #并非 flaskrun的端口,而是内部tcp通讯的端口
chmod-socket = 662
chdir = /aips/aips-nxp-web-back/app/ #指定工程目录
wsgi-file = app.py #指定工程文件
callable = app #app = Flask(__name__),这里的app
master = true
processes = 4
virtualenv = /aips/aips-nxp-web-back/py3env/ #指定应用的虚拟环境
vacuum = true
这里的socket=127.0.0.1:8001 与nginx.conf内server的配置中的uwsgi_pass 127.0.0.1:8001中的端口是对应的;
在完成以上配置后,需要通过uwsgi重新启动python程序,在之后就可以在浏览器看到效果了。
nginx服务器是一个轻量化的web服务器,具有占用内存小,稳定性强,并发服务能力强,支持反向代理等优点,提供负载均衡和HTTP缓存。在我们的使用中安装部署相关的内容也非常的易行,对比Apache,目前更多的涉及python的webserver,使用nginx是更不错的选择。
在这个部署中,nginx负责指定IP和端口,以及分派动态文件的处理任务到uwsgi,uwsgi则负责启动python程序,等候nginx的静态文件处理请求,这样 就完成了。
这是个入门的部署,在后续还需要添加一些实际图,以及vue相关的启动。
1.整体梳理部署概况:
https://blog.csdn.net/weixin_42744102/article/details/99880602
2.步骤较详细的:
https://blog.csdn.net/XiaoXiaoYunXing/article/details/122705864
https://blog.csdn.net/qq_56688614/article/details/126807370