django项目请求逻辑:
用户访问 -> nginx -> uwsgi -> django
其中静态文件 直接由 nginx 处理
-
在部署之前,先改动django项目的settings文件
更改如下
DEBUG = False ALLOWED_HOSTS = ['*', ]
-
测试django项目是否正常运行
使用 django 内置的服务器测试一下:在项目的根目录中运行命令
python manage.py runserver
这个命令默认运行服务器在 8000 端口, 而且只会监听来自本机(服务器)的请求 如果需要在服务器之外的电脑中浏览, 需改成这个命令
python manage.py runserver 0.0.0.0:8000
-
安装 uwsgi
sudo apt-get install uwsgi # 或者 pip install uwsgi
可以用
uwsgi --version
来检查是否正确安装了 -
安装python-dev
安装 uwsgi 过程中, 需要编译, 要先安装 python 开发板
sudo apt-get install python3-dev
-
安装gcc
安装 uwsgi 需要一个 C 编译器, 所以还需要安装一个 gcc
sudo apt-get install gcc
-
测试 uwsgi
创建一个 test.py 文件测试
内容如下
# test.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]
在test.py文件的目录下运行命令
uwsgi --http :8000 --wsgi-file test.py
打开浏览器输入服务器的 ip, 端口 8000 如果能看到 hello, world 就表安装 uwsgi 成功了 !!!
-
使用 uwsgi 测试 Django 项目
在项目的根目录下运行
uwsgi --http :8000 --module blog.wsgi
打开浏览器输入服务器的 ip, 端口 8000 如果能看到django 的测试页面就表示 django 和 uwsgi 工作正常
-
安装nginx
sudo apt-get install nginx
安装完毕,会自动开启 nginx 服务, 默认端口80, 打开浏览器, 输入服务地址, 可以看到 nginx 的测试页面
-
配置 nginx
新创建一个 nginx 配置文件, blog.conf
内容如下
upstream django { server 127.0.0.1:8001; # 与uwsgi通信的地址(ip和端口) } server { listen 80; # 监听的端口 server_name 192.168.92.128; # 服务器的ip或者域名 charset utf-8; client_max_body_size 75M; # 上传文件大小的最大值 location /static { alias /home/pyvip/www/mysite/blog/static; # 设置静态文件的路径 } location /media { alias /home/pyvip/www/mysite/blog/media; # 设置静态文件的路径 } location / { uwsgi_pass django; # 动态内容请求都通过名为django的upstream传递给uWSGI,与之前blog.ini里的socket参数配置一致 include /etc/nginx/uwsgi_params; # Nginx向uWSGI传递的参数 } }
这个配置文件告诉 nginx 从文件系统中拉起 media 和 static 文件作为服务,同时响应 django 的 request 。
在 /etc/nginx/sites-enabled 目录下创建本文件的软链接, 使 nginx能够使用它:
sudo ln -s /home/pyvip/www/mysite/blog/blog.conf /etc/nginx/sites-enabled/
-
部署静态文件
在 django 的 setting 文件中,添加下面一行内容:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
然后运行
python manage.py collectstatic
-
测试 nginx 静态文件和媒体文件服务
首先重启nginx服务:
sudo service nginx restart
测试一下静态文件是否可以读取
访问 http://<服务器 ip>:8000/static/admin/css/base.css 看看是否正常显示这个文件
然后检查media文件是否已经正常
在项目根目录
下新建一个 media 文件夹, 放入任意一张图片, 名字改为test.jpg
访问 http://<服务器 ip>:8000/media/test.jpg 看看是否正常显示图片 -
测试 nginx + uwsgi
找到 第 5 步 创建的test.py, 放到 Django 项目根目录下测试 运行命令
uwsgi --socket :8001 --wsgi-file test.py
访问 http://<服务器 ip>:8000/ 如果能够显示 hello, world 就行了
-
用 UNIX socket 取代 TCP port
unix socket是个文件,所以会受到unix系统的权限限制。如果你的uwsgi客户端没有权限访问uWSGI socket,你可以用这个选项
chmod-socket=662
设置unix socket的权限。对 blog.conf 做如下修改
upstream django { #server 127.0.0.1:8001; # 去掉这行 server unix:/home/pyvip/www/mysite/blog/blog.sock; # 新建这行 }
然后重启服务器, 并运行 uWSGI, 代码如下
service nginx restart uwsgi --socket blog.sock --wsgi-file test.py --chmod-socket=662
访问 http://<服务器 ip>:8000/ 如果能够显示 django 的测试页面就大功告成了
-
使用 ini 文件运行 uwsgi
写一个文件来方便运行 uwsgi 在项目根目录下创建一个 blog.ini
[uwsgi] chdir=/home/pyvip/www/mysite/blog # django项目的根目录 module=blog.wsgi # 加载指定的python WSGI模块(模块路径必须在PYTHONPATH里) home=/home/pyvip/.virtualenvs/blog_env # 虚拟环境的路径 processes=4 # 最大工作的进程数,进程越多可以同时处理的请求越多 threads=2 # 最大工作的线程数 vacuum=true # 退出时清除环境 master=true # 启动一个master进程来管理其他进程,以上述配置为例,其中的4个uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程 socket=/home/pyvip/www/mysite/blog/blog.sock # uwsgi监听的socket # http=ip:端口 # http协议 chmod-socket=662 # 设置socket文件的访问权限(默认为666) daemonize = /home/pyvip/www/mysite/blog/blog.log # 日志文件的路径 http= 192.168.92.128:9000 # 对外提供 http 服务的端口(服务器ip也可以不写) stats = 127.0.0.1:9191 # 通过该端口可以监控 uwsgi 的负载情况 pidfile=/home/pyvip/www/mysite/blog/blog.pid # 在失去权限前,将master的pid写到当前文件中
-
运行 uwsgi
运行 uwsgi的时候就只需要运行这个命令就行了
uwsgi --ini blog.ini
停止
uwsgi
服务uwsgi --stop blog.pid