1、新建独立运行环境,命名为env
1
2
3
4
5
6
|
[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项目
目录结构:
1
2
3
4
|
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目录,目录结构如下:
1
2
3
4
5
6
7
|
/ root / projects /
script / - - > 存放uwsgi相关的文件,例如uwsgi.ini, uwsgi.pid...
hello / - - > 项目目录
apps / - - > 应用程序目录
hello / - - > settings.py等文件所在目录
static /
env / - - > 虚拟环境目录
|
[root@vultr projects]# vi script/uwsgi.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
[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的命令
1
2
|
[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
1
2
3
4
5
6
7
|
[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 # 名字是随便起的,建议跟项目目录一样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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是否启动了
1
2
3
4
5
6
7
8
9
|
[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的错误日志文件,日志文件在哪呢???
1
2
3
|
[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/:
1
2
3
4
5
6
|
[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:
1
2
3
|
[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项目是否正常。 我的目录结构是:
1
2
3
4
5
6
7
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
[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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
# 可以分开多个配置文件,这里我放在同一个配置文件里
[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