uwsgi启动flask项目(venv虚拟环境)

一、下载uwsgi:

pip3 install uwsgi

 

 

 

[uwsgi: command not found]解决办法:建立软链接 

ln -s pip下载的uwsgi目录 /usr/bin/uwsgi

例如:ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi3

注意:有些机器配置的不止一个uwsgi,所以要看uwsgi命令映射的是哪个python版本的,也可以像我这样,给python3环境的uwsgi映射成uwsgi3。

 

二、配置虚拟环境:

方式一:利用venv方式创建虚拟环境

1、通过命令创建一个虚拟环境目录

python3 -m venv /home/pkuokuo/venv/my_system

会自动生成该目录

 2、激活虚拟环境

source /home/pkuokuo/venv/my_system/bin/activate

 

3、 进入到虚拟环境下

这里面就可以使用虚拟目录环境,直接在虚拟环境中pip下载所需要的依赖包。光标前面带一个括号,代表是在虚拟环境下

 

 

 

 

4、退出虚拟环境命令:

deactivate

 

方式二:配置virtualenv虚拟环境

 

三、启动uwsgi

1、启动命令:

uwsgi uwsgi.ini

2、uwsgi.ini:

#uwsgi --ini uwsgi.ini             # 启动
#uwsgi --reload uwsgi.pid          # 重启
#uwsgi --stop uwsgi.pid            # 关闭


[uwsgi]
# 字符编码
env=LC_ALL=en_US.UTF-8

# 指定IP端口
http = :8386

# the local unix socket file than commnuincate to Nginx   用于和 nginx 进行数据交互的端口
#socket = 127.0.0.1:8001

# 项目目录
chdir = /opt/my_system

# 启动文件地址
wsgi-file = /opt/my_system/manage.py
#wsgi-file = my_system/manage.py

# uWSGI加载的模块中哪个变量将被调用
callable = app

# 自动移除unix Socket和pid文件当服务停止的时候
vacuum = true

# socket权限设置
#chmod-socket = 664

# uWSGI服务器运行时的用户id
uid=root

# uWSGI服务器运行时的用户组id
gid=root

# 启用主进程
master = true

# 进程个数,工作进程的最大数量
processes = 5

# 主进程id文件目录
pidfile = /opt/my_system/uwsgi.pid

# 启用线程
enable-threads=true

# 在每个辅助进程中启动的线程数
threads=4

# 一个高阶的cheap模式,在启动的时候只会分配n个工作进程,并使用自适应算法启动新的进程,must be lower than processes
#cheaper = 10

# 在经过sec秒的不活跃状态的进程会被销毁(进入了cheap模式),并最少保留cheaper指定的进程数
#idle = 3600

# 设置自中断时间,设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri=30

# 当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose = true

# 开启内存使用情况报告
memory-report = true

# 设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy = 10

# 设置缓冲
#post-buffering=4096

# 控制台输出日志目录
daemonize = /var/log/53kf/my_system/my_system.log

# 设置日志监听对象
#logto=/var/log/53kf/my_system
#touch-logreopen=/var/log/53kf/my_system/.touchforlogrotat

# 通过该端口可以监控 uwsgi 的负载情况
stats = 127.0.0.1:8387

# 配置虚拟环境路径
virtualenv = /home/pkuokuo/venv/my_system

#设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
#buffer-size=65536

#在每个worker而不是master中加载应用
#lazy-apps=true



# 设置工作进程使用虚拟内存超过N MB就回收重启
#reload-on-as= 1024

# 自动给进程命名
#auto-procname = true

# 为进程指定前缀
#procname-prefix-spaced = xc-mms

# 设置工作进程每处理N个进程就会被回收重启
#max-requests=500000
 
# 设置工作进程使用物理内存超过N MB就回收重启
#reload-on-rss=100

# 设置socket超时时间,默认4秒
#socket-timeout=10
 
# 限制http请求体的大小(Bytes)
#limit-post=4096

# clear environment on exit
#vacuum = true

# 不记录request日志,只记录错误日志
#disable-logging = true
 
# 将日志打印到syslog上
#log-syslog = true

#stats = /opt/my_system/uwsgi.status

 

 

 

3、访问失败或者访问接收不到可能是因为开了防火墙。

centos7查看防火墙状态:

systemctl status firewalld.service

 

关闭运行的防火墙:

systemctl stop firewalld.service    

 

四、问题总结

 错误1:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-40: ordinal not in range(128)

原因是打印日志的时候打印了中文。

log.info('初始化热门产品')

 解决:

该问题是由于操作系统文件编码格式的问题,

 可以查看服务器的编码,利用命令:locale

 

 

(C指的是标准 ISO C的区域机制;区域支持指的是应用遵守文化偏好的问题,包括字母表、排序、数字格式等) 

可以看到除了第一个为utf-8外,其他的都为默认格式。这样对中文编码可能会引起中文编码异常,我们需要将所有参数都配置成utf-8的:

export LC_ALL=en_US.UTF-8

运行上面这句代码后,便将所有的参数设置成utf-8

 

 这样运行就不会出现中文编码错误了,但是对于公共系统环境,随意的更改系统编码可能会导致其他项目出现问题,所以这里提供的解决办法:单独对这一个项目进行配置,所以我们在uwsgi的启动配置文件uwsgi.ini中加入这个配置:

# 字符编码
env=LC_ALL=en_US.UTF-8

这样就完美的解决了这一个项目的字符编码问题,也不会影响到其他的项目运行。

 

 

注: 

1、 LANG是一个缺省值,所有没有显式设置值的LC_*变量都会取LANG的值。
2、 LANGUAGE的优先级比较高,会覆盖所有设置过的LC_*的值
3、 LC_ALL并不是一个环境变量,而是一个glibc中定义的一个宏,LC_ALL=C这样的语法实际上是调用了setlocale把所有的LC_*的变量设置了一遍。

从优先级的角度,变量生效的优先顺序从高到低如下:

1、 LANGUAGE 优先级最高,指定个人对语言环境值的主次偏好,例如zh_CN:en_US:en,冒号分隔的是多种选择。
2、 LC_ALL 设置的值
3、 LC_* 可设定locale各方面(category)的值,可以覆盖LANG的值。
4、LANG 指定默认使用的locale值


posted @ 2021-05-07 18:01  砰砰的猿  阅读(3172)  评论(0编辑  收藏  举报