在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
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 使用场景 相同的方法,不同的执行顺...
    Tyhj阅读 1,025评论 0 7
  • 7月29日计划 早7:30起床,8:00早餐,9:00出发到恩施,下午找死党,晚上和死党顾问则明见面,22:00给...
    zengkai1198阅读 118评论 0 1
  • 总觉得一天很长,可当你睡到八点起床吃饭,中午发现好困啊还要睡一个半小时,下午还想出去健身透透气,晚上还想看会视频再...
    1d992bae2640阅读 152评论 0 1
  • 名利场中琐事忙,何如消散与疏狂。曾弃落雨闲暇日,累上留云半生时,书百卷,酒千殇。大开白眼看王侯,玉楼金阕慵归去,且...
    和兴路阅读 335评论 0 0