一、准备工作:
1,搭建虚拟环境,使用virtualenv,没有安装的需要安装
$ apt-get install virtualenv # 安装
创建虚拟环境:
$ virtualenv webvenv # 虚拟环境名为webvenv
启动虚拟环境(注意:如果切换目录的话,webvenv前需要加相对路径):
$ source webvenv/bin/activate
2,虚拟环境内安装uWSGI,
(webvenv)$ pip install uwsgi
3,虚拟环境安装Django,
(webvenv)$ pip install django
4,安装Nginx
$ apt-get install nginx
5,Django项目结构
mysite
├── db.sqlite3
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── polls
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── __pycache__
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── test.py
└── uwsgi.ini
test.py为创建的测试文件,uwsgi.ini是创建的配置文件,下面会说。
二、配置uwsgi
测试uwsgi;项目根目录下创建test.py文件,内容如下;
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
在mysite文件夹下,运行:
(webvenv)mysite $ uwsgi --http 127.0.0.1:9090 --wsgi-file test.py
打开浏览器,输入127.0.0.1:9090,如果出现hello world,则证明uWSGI安装成功!
部署Django:
运行 uwsgi,
uwsgi --http 127.0.0.1:9090 --wsgi-file mysite/wsgi.py
报错,No module named django.core.wsgi,
搜索了多个博客文章,试了几种方案全部失败,和我遇到的场景不同,退出虚拟环境,运行成功,进入虚拟环境,依然失败,逐步排后发现问题,是虚拟环境中python版本的问题,python2没有安装Django,无法导入模块,python3可以,而创建虚拟环境时,默认安装python2版本,
重新创建虚拟环境,创建时指定python3版本, 进入新的虚拟环境,
$ virtualenv -p /usr/bin/python3 webvenvs
重新运行uwsgi --http 127.0.0.1:9090 --wsgi-file mysite/wsgi.py 命令,成功!
(注意:如果使用root用户运行命令,会有警告信息)
Ctrl + C 停止uwsgi服务,(如果是后台启动,有配置pidfile选项,可以用uwsgi --stop uwsgi.pid来停止服务,
没有配置pidfile,可以kill进程停止服务:pkill -f uwsgi -9
配置uwsgi.ini,使用配置文件启动uwsgi服务
项目根目录下创建uwsgi.ini文件
[uwsgi] # 这个一定不能少哦,否则会一直警告:WARNING: Can't find section "uwsgi" in INI configuration file uwsgi.ini
socket = :8080
# 端口(使用nginx连接时,使用socket,直接做web服务器,使用http)
#http=127.0.0.1:8081
# 项目目录
chdir = /home/dongdong/mysite/
# 指定项目的application
module = mysite.wsgi
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 设置启动用户
uid=xxx
# 进程数
processes=4
# 线程
threads=2
# pidfile文件
#pidfile=%(chdir)uwsgi.pid
# 记录日志
#daemonize=%(chdir)uswgi.log
只保留了关键的配置,其他的可以后期再添加。
进入mysite文件夹,执行命令
uwsgi --ini uwsgi.ini
启动成功(这时候我的Nginx也是处于启动状态的,如果和我的有些不同的话,要自行对照了,配置里开启日志记录后,这些启动信息会记录在日志里,不会打印到终端了)
三、配置Nginx文件
进入/etc/nginx/目录下,复制uwsgi_params文件到mysite目录下,
在mysite文件夹下创建配置文件,mysite_nginx.conf,内容如下
server {
# the port your site will be served on
listen 8099;
# the domain name it will serve for
server_name 127.0.0.1; # substitute your machine's IP address or FQDN
charset utf-8;
root /var/www/example;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8080;
uwsgi_read_timeout 2;
}
# Django media
# location /media {
# alias /home/dongdong/mysite/media; # your Django project's media files - amend as required
# }
#
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/dongdong/mysite/static; # your Django project's static files - amend as required
}
}
使用了自定义的配置文件,就不用配置Nginx.conf文件了,
创建软连接,把自定义的配置文件,添加到/etc/nginx/sites-enabled/文件夹下
ln -s /home/dongdong/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/
此处有个坑,要使用绝对路径,否则会报错,还要删除默认的default软连接,否则配置会冲突
启动Nginx:
sudo /usr/sbin/nginx
查看版本:
sudo sbin/nginx -v
重新启动Nginx命令:
sudo /usr/sbin/nginx -s reload
停止Nginx命令:
sudo sbin/nginx -s stop
浏览器访问127.0.0.1:8099(注意:如果Django项目配置了路由的话,要加上)
完成时的项目结构:
mysite
├── db.sqlite3
├── index.html
├── manage.py
├── media
├── mysite
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── mysite_nginx.conf
├── polls
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── __pycache__
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── static
├── templates
├── test.py
├── uwsgi.ini
└── uwsgi_params
成功,可以根据需要,去添加更多功能的配置了。(我是部署成功后才回头做的总结,有些地方可能写的不够详细,如有疑问,可以留言交流)
参考资料: 通过Nginx部署Django(基于ubuntu) (这篇文章给我很多帮助,几个不理解的配置看了文章才明白)