在Ubuntu下部署 Django + uwsgi + nginx

django项目请求逻辑:

  1. 用户访问 -> nginx -> uwsgi -> django

  2. 其中静态文件 直接由 nginx 处理

  3. 在部署之前,先改动django项目的settings文件

    更改如下

    DEBUG = False
    ALLOWED_HOSTS = ['*', ]
    
  4. 测试django项目是否正常运行

    使用 django 内置的服务器测试一下:在项目的根目录中运行命令

    python manage.py runserver
    

    这个命令默认运行服务器在 8000 端口, 而且只会监听来自本机(服务器)的请求 如果需要在服务器之外的电脑中浏览, 需改成这个命令

    python manage.py runserver 0.0.0.0:8000
    
  5. 安装 uwsgi

    sudo apt-get install uwsgi
    # 或者
    pip install uwsgi
    

    可以用 uwsgi --version来检查是否正确安装了

  6. 安装python-dev

    安装 uwsgi 过程中, 需要编译, 要先安装 python 开发板

    sudo apt-get install python3-dev
    
  7. 安装gcc

    安装 uwsgi 需要一个 C 编译器, 所以还需要安装一个 gcc

    sudo apt-get install gcc
    
  8. 测试 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 成功了 !!!

  9. 使用 uwsgi 测试 Django 项目

    在项目的根目录下运行

    uwsgi --http :8000 --module blog.wsgi
    

    打开浏览器输入服务器的 ip, 端口 8000 如果能看到django 的测试页面就表示 django 和 uwsgi 工作正常

  10. 安装nginx

    sudo apt-get install nginx
    

安装完毕,会自动开启 nginx 服务, 默认端口80, 打开浏览器, 输入服务地址, 可以看到 nginx 的测试页面

  1. 配置 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/
    
  2. 部署静态文件

    在 django 的 setting 文件中,添加下面一行内容:

    STATIC_ROOT = os.path.join(BASE_DIR, "static/")
    

    然后运行

    python manage.py collectstatic
    
  3. 测试 nginx 静态文件和媒体文件服务

    首先重启nginx服务:

    sudo service nginx restart
    

    测试一下静态文件是否可以读取
    访问 http://<服务器 ip>:8000/static/admin/css/base.css 看看是否正常显示这个文件
    然后检查media文件是否已经正常
    项目根目录下新建一个 media 文件夹, 放入任意一张图片, 名字改为test.jpg
    访问 http://<服务器 ip>:8000/media/test.jpg 看看是否正常显示图片

  4. 测试 nginx + uwsgi

    找到 第 5 步 创建的test.py, 放到 Django 项目根目录下测试 运行命令

    uwsgi --socket :8001 --wsgi-file test.py
    

    访问 http://<服务器 ip>:8000/ 如果能够显示 hello, world 就行了

  5. 用 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 的测试页面就大功告成了

  6. 使用 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写到当前文件中
    
  7. 运行 uwsgi

    运行 uwsgi的时候就只需要运行这个命令就行了

    uwsgi --ini blog.ini
    

    停止uwsgi服务

    uwsgi --stop blog.pid
    

你可能感兴趣的:(在Ubuntu下部署 Django + uwsgi + nginx)