Python开发之Nginx+uWSGI+virtualenv多项目部署教程
作者:门牙 发布时间:2023-07-30 04:42:39
1、新建独立运行环境,命名为env
[root@vultr ~]# mkdir projects # 测试的项目总目录
[root@vultr ~]# pip3 install virtualenv
[root@vultr ~]# cd projects
[root@vultr projects]# virtualenv env --python=python3 --no-site-packages
--python:指定Python版本
--no-site-packages:不复制系统已安装Python包
2、激活虚拟环境
[root@vultr projects]# source env/bin/activate
执行后命令提示符前面会出现一个env,变成(env)[root@vultr opt]#,退出虚拟环境执行deactivate即可。
3、安装项目依赖:
pip3 install, 在虚拟环境中安装的包,不会对系统环境造成影响。
Django项目配置
1、上传Django项目: Hello项目
目录结构:
Hello/
apps/
Hello/
manage.py
2、配置项目的数据库信息:vi Hello/Hello/settings.py
如果是远程服务器,需要修改setting.py文件中的ALLOWED_HOSTS:
ALLOWED_HOSTS = ['*']
3、数据迁移
(env)[root@vultr Hello]# python3 manage.py makemigrations
(env)[root@vultr Hello]# python3 manage.py migrate
4、收集静态文件:vi Hello/Hello/settings.py
STATIC_ROOT = os.path.join(BASE_DIR, "static")
:wq保存后,执行
(env)[root@vultr Hello]# python3 manage.py collectstatic --noinput
5、用runserver启动项目,看是否正常运行
(env)[root@vultr Hello]# python3 manage.py runserver 0.0.0.0:8088
uWSGI配置
deactivate退出虚拟环境
1、安装uWSGI
[root@vultr Hello]# pip3 install uWSGI
2、命令行运行测试
在 项目目录Hello 下,执行以下命令:
[root@vultr Hello]# uwsgi --http ip:端口 --home /root/env/ --file Hello/wsgi.py --static-map=/static=static
--home:指定虚拟环境的目录
wsgi.py:Django创建项目时生成的文件
如果访问URL正常,说明Python虚拟环境和uWSGI没有问题.
3、使用ini配置文件来启动uWSGI
我习惯性创建projects目录,目录结构如下:
/root/projects/
script/ --> 存放uWSGI相关的文件,例如uwsgi.ini, uwsgi.pid...
Hello/ --> 项目目录
apps/ --> 应用程序目录
Hello/ --> settings.py等文件所在目录
static/
env/ --> 虚拟环境目录
[root@vultr projects]# vi script/uwsgi.ini
[uwsgi]
# 项目目录
chdir=/root/projects/Hello/
# 虚拟环境目录
home=/root/projects/env/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=Hello.wsgi:application
# 指定sock的文件路径
socket=/root/projects/script/uwsgi.sock
# 启用主进程
master=true
# 进程个数
workers=5
pidfile=/root/projects/script/uwsgi.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/root/projects/script/uwsgi.log
4、后台启动停止uWSGI的命令
[root@vultr projects]# uwsgi --ini script/uwsgi.ini # 启动
[root@vultr projects]# uwsgi --stop script/uwsgi.pid # 停止
Nginx配置
1、 配置yum:
[root@vultr projects]# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
# 下面这行centos根据你自己的操作系统修改比如:OS/rehel
# 6是你Linux系统的版本,可以通过URL查看路径是否正确
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
2、 安装: yum -y install nginx
3、添加配置文件
[root@vultr projects]# vi /etc/nginx/conf.d/Hello.conf # 名字是随便起的,建议跟项目目录一样
server {
listen 84; # 端口
server_name 10.129.205.183 ; # 域名
access_log /var/log/nginx/access.log main;
charset utf-8;
gzip on;
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 指定项目路径uwsgi
location / {
include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
uwsgi_connect_timeout 30; # 超时时间
uwsgi_pass unix:/root/projects/script/uwsgi.sock;
}
# 指定静态文件路径
location /static/ {
alias /root/projects/Hello/static/;
index index.html index.htm;
}
}
4、启动与停止Nginx
检查uWSGI是否启动了
[root@vultr projects]# ps -ef | grep uwsgi
root 2299 1 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2301 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2302 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2303 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2304 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2305 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2306 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2361 2016 0 06:32 pts/1 00:00:00 grep uwsgi
启动Nginx
[root@vultr projects]# /etc/init.d/nginx start
访问URL,见证奇迹的时刻到了,然后...
ok,报错了,莫慌。度娘查了502是服务器错误,然而前面测试了Django+uWSGI没问题,所以最有可能是在Nginx出错了。
来,我们查看一下Nginx的错误日志文件,日志文件在哪呢???
[root@vultr projects]# find / -name nginx.conf
/etc/nginx/nginx.conf
[root@vultr projects]# vi /etc/nginx/nginx.conf
error_log参数就是错误日志文件了,让我们再打开error.log文件,找到最后一条记录:
2019/05/12 06:41:43 [crit] 1514#1514: *2 connect() to unix:/root/projects/script/uwsgi.sock failed (13: Permission denied) while connecting to upstream, ...(后面省略)
从 failed (13: Permission denied) while connecting to upstream 可以看出是没有权限???原因是我贪图方便, 直接把项目文件以及uWSGI文件放在了/root/目录下 !!!
好,修改路径,先停止Nginx和uWSGI,再修改路径/root/projects/更改为/opt/projects/:
[root@vultr projects]# uwsgi --stop script/uwsgi.pid
[root@vultr projects]# /etc/init.d/nginx stop
停止 nginx: [确定]
[root@vultr projects]# cd ..
[root@vultr ~]# mv projects /opt/
[root@vultr ~]# cd /opt/projects/
然后将script/uwsgi.ini和/etc/nginx/conf.d/Hello.conf中关于路径的都修改过来,修改好后,再次启动uWSGI和Nginx:
[root@vultr projects]# uwsgi --ini script/uwsgi.ini
[uWSGI] getting INI configuration from script/uwsgi.ini
[root@vultr projects]# /etc/init.d/nginx start
正在启动 nginx: [确定]
再次访问URL, 访问正常。
多项目部署
利用virtualenv可以在服务器上配置多个Python运行环境,因此根据Nginx、uWSGI、virtualenv可以实现一个服务器上运行多个项目,且互不干扰。
首先我们先来了解一下Nginx+uWSGI通信原理。
请求首先交给Nginx,如果是静态内容Nginx就直接处理了,如果是动态内容就将请求交给uWSGI服务器,Nginx和uWSGI之间是通过Socket来通信的,通信协议就是/etc/nginx/conf.d/Hello.conf里配置的uwsgi_params文件。
那么,现在我们来梳理一下,Nginx是怎么知道uWSGI在哪里?通过什么和uWSGI做Socket通信,回看/etc/nginx/conf.d/Hello.conf文件:
原来是根据uwsgi_pass指定了Nginx与uWSGI通信的Socket文件路径,看到这,就知道好办了,一个项目配置一个uwsgi.ini文件和nginx.conf里的一个server,那既然需要部署多个项目,那就是多个uwsgi.ini和nginx.conf里的多个server。
好的,我们开始测试:
1、配置虚拟环境以及测试用runserver运行Django项目是否正常。 我的目录结构是:
opt/
projects/
Hello/ --> 第一个Django项目
env/ --> 第一个Django项目的虚拟环境
World/ --> 第二个Django项目
env_1/ --> 第二个Django项目的虚拟环境
script/ --> uwsig.ini等文件存放
2、配置World项目的uwsgi_world.ini文件
[root@vultr projects]# vi script/uwsgi_w.ini
[uwsgi]
# 项目目录
chdir=/opt/projects/World/
# 虚拟环境目录
home=/opt/projects/env_1/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=World.wsgi:application
# 指定sock的文件路径
socket=/opt/projects/script/uwsgi_w.sock
# 启用主进程
master=true
# 进程个数
workers=5
pidfile=/opt/projects/script/uwsgi_w.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/opt/projects/script/uwsgi_w.log
3、配置Nginx
# 可以分开多个配置文件,这里我放在同一个配置文件里
[root@vultr projects]# vi /etc/nginx/conf.d/Hello.conf
server {
listen 84; # 端口,请注意端口
server_name 10.129.205.183 ; # 域名
access_log /var/log/nginx/access.log main;
charset utf-8;
gzip on;
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 指定项目路径uwsgi
location / {
include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
uwsgi_connect_timeout 30; # 超时时间
uwsgi_pass unix:/opt/projects/script/uwsgi.sock;
}
# 指定静态文件路径
location /static/ {
alias /opt/projects/Hello/static/;
index index.html index.htm;
}
}
server {
listen 86; # 端口,请注意端口
server_name 10.129.205.183 ; # 域名
access_log /var/log/nginx/access.log main;
charset utf-8;
gzip on;
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 指定项目路径uwsgi
location / {
include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
uwsgi_connect_timeout 30; # 超时时间
uwsgi_pass unix:/opt/projects/script/uwsgi_w.sock;
}
# 指定静态文件路径
location /static/ {
alias /opt/projects/World/static/;
index index.html index.htm;
}
}
4、启动uWSGI和Nginx,访问两个端口的URL。 ok,访问正常。
总结
以上所述是小编给大家介绍的Python开发之Nginx+uWSGI+virtualenv多项目部署教程,希望对大家有所帮助!
来源:https://juejin.im/post/5cd82e2c518825688d0aaec0
猜你喜欢
- 写在前面的话:此篇还是asp相关的,相信玩ASP的都有这个感觉,当数据有5万多条时-------just like音乐网,要调用最新的10条
- 当我们的文章表中没有对于文章的评论数字段时,我们该这么写sql语句来显示出评论最多的文章呢?下面本站给大家收集了几种方法,仅供参考:1.se
- 在Vista IIS 7 中用 vs2005 调试 Web 项目核心是要解决以下几个问题:1、Vista 自身在安全性方面的User Acc
- 仿豆瓣分页原型(Javascript版)写了个分页的样式。自我感觉,这样的分页前后兼顾,对于用户的体验是蛮好使的Javascript分页代码
- 网上有很多提供在线按钮制作、文字标题制作、Logo制作服务的网站,它们可以非常方便了让大家轻松的获得效果出色的各类图标型的图片,下面就快来看
- 1、给定的日期格式相同,则使用简单的比较运算符来比较日期。<?php//声明两个日期、初始化$date1 = "2021-1
- 如何向前端推送用户请求的信息?postinfo.htm<head><title>asp教程之回应用户请求信息&nbs
- 新闻、文章系统中经常会用到的一个功能,添加上一篇,下一篇或相关文章的功能可以增加访客停留的时间。也许新人在做这上一篇、下一篇功能时使用的是I
- 这世上“没有丑女人,只有懒女人”这是女人美丽圣经里的最精彩的一句话了,一个女人只要舍得花时间琢磨怎么保养,怎么打扮,总能够找到方法展现自己美
- 修改MySql Server安装目录下的 my.ini 文件,在mysqld节下加入下面一行set-variable=lower_case_
- ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据
- jquery作为一款高质量的框架被大多web开发者所推崇。jquery也的确是一款伟大的产品,在实际开发中明显提高了效率。但是任何产品并不是
- 很多朋友都有过制作网页的经历,如今,众多网页的设计都用到了表格。这样不仅有利于网页的维护,同时,提高了网页的观赏性。在众多网页制作风格中,细
- 关于段落<p></p>相信大家已经都在自己的工作中开始关注并应用了。因为那真的是非常简单的事,只要你愿意你随时都可以
- php遍历目录和文件的场景在很多时候都能用到,遍历目录方法的方法有好几种,那么应该使用
- 众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著。前些天我做自己
- 用ASP编写虚拟社区、网上购物等程序时,Application和Session对象具有举足轻重的作用,能够灵活合理地运用这两个对
- 为什么我写ASP分页教程要提到AJAX呢,因为我们要多练习一下编程过程中,结构化的重要性. 再加上很多朋友对分页感到很高深,所以一直都不敢去
- 一、垃圾还是经典网页技术更新很快,一个网站的界面设计寿命仅仅2-3年而已。不管是垃圾还是精品,都没有所谓的经典。经典只存在于是哪个首次成功创
- 我们经常会用到表格数据,在做表格的时候,一般都喜欢隔行变色,使表格表现数据的时候非常的清晰。如图,我设计的一个表格表现的样式:在网上找到一个