Linux系统下部署Nginx+uwsgi+flask环境(centos7和kylin)

1.背景介绍

目标是在kylin上部署一个Nginx服务器,用于为前端后端程序分配IP和端口。不过在实际使用时因为种种原因我先在centOS上进行了一下操作复现,过程比较顺利;接下来就在kylin系统进行了这个复现,过程同样顺利。
整个过程可以描述为:
Linux环境下创建venv虚拟环境,并测试虚拟环境中python+flask工程的运行状态;虚拟环境中通过pip安装和配置uwsgi,以及通过uwsgi启动python程序;安装Nginx以及测试Nginx的基本操作;最后进行整个项目的部署,通过Nginx配置后端程序以及静态文件以什么样的方式进行启动。

2.Linux环境的python

2.1 创建及使用虚拟环境

2.1.1 pipenv

pip install pipenv  #安装
pipenv shell  #进入(创建)虚拟环境
exit #退出环境
pipenv --rm  #删除整个环境
pipenv run python manage.py runserver  #虚拟环境下运行

2.2.2 virtuanenv

pip install virtualenv  #安装
virtualenv py3env  #创建名为py3env的虚拟环境
source py3env/bin/activate #启动虚拟环境
deactivate #退出虚拟环境

2.2 虚拟环境下运行python

  • python测试代码:
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
flask run

即可启动这个程序,通过浏览器可以查看

  • 说明:虚拟环境和python程序不必在一个文件夹内,需要先启动虚拟环境,在虚拟环境运行相关的代码即可。

3.uwsgi启动python

3.1 uwsgi安装和使用

需要在虚拟环境内安装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

3.2 uwsgi启动python

启动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

4.Nginx安装和运行

4.1 Nginx的安装方式

4.1.1 源码编译安装

下载: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

4.1.2 yum安装

在kylin系统采用的是直接安装Nginx的方式,这里安装时会自动安装好相关的依赖环境。

yum inxtall nginx

4.2 Nginx的启动和操作

4.2.1 操作

我的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就不需要指定位置信息了

4.2.2 配置文件和日志文件

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"

5.Nginx配置和uwsgi交互

5.1 Nginx配置


#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/

5.2 uwsgi配置

[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程序,在之后就可以在浏览器看到效果了。

5.3 启动效果

6.总结

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

你可能感兴趣的:(web开发,flask,linux,nginx)