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值
本文仅限于技术交流,若造成不良影响,本文创作人员概不负责,请支持正版应用,注重产权保护!!
(您的“打赏”将是我最大的写作动力!转载请注明出处.)
关注微信公众号 |