• django+nginx+uwsgi部署


    安装python

    在python下载源码包:

    wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 
    # 解压
    tar -zxf  Python-3.6.5.tgz 
    cd Python-3.6.5
    
    #编译
    
    ./configure --prefix=/appliocation/python3 --enable-optimizations
    
    make && make install 
    
    # 配置环境变量
    vim ~/.bash_prefile
    
    # 在这一行增加python的bin路径,如下  
    export PATH=$HOME/bin:/usr/local/python3/bin:/usr/local/bin:$PATH
    
    source ~/.bash_profile
    

      安装django

    pip3 isntall django==1.11.8
    # 创建django项目
    django-admin startproject hello_django
    cd hello_django
    #创建应用
    python3 manager.py startapp app01
    #创建uwsgi配置文件
    vim hello_django.ini
    #输入这些内容
    # myweb_uwsgi.ini file
    [uwsgi]
    
    # Django-related settings
    
    socket = :8080
    #真实服务的端口
    
    # Django项目根目录 (绝对路径)
    chdir           = /root/hello_django
    
    # wsgi.py文件在项目中的位置
    module          = hello_django.wsgi
    
    # process-related settings
    # master
    master          = true
    
    # 运行的进程数
    processes       = 4
    
    # ... with appropriate permissions - may be needed
    # chmod-socket    = 664
    # clear environment on exit
    vacuum          = true

    启动uwsgi

    # 安装基础开发包
    yum groupinstall "Development tools"
    yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
    
    # 安装uwsgi
    pip install uwsgi
    uwsgi --version    # 查看 uwsgi 版本
    
    uwsgi hello_django/hello_django.ini
    在seething.py修改才可以访问,默认只是localhost,如下
    ALLOWED_HOSTS = ['192.168.0.75', '127.0.0.1', 'localhost']

    安装Nginx

    cd ~
    wget http://nginx.org/download/nginx-1.5.6.tar.gz
    tar xf nginx-1.5.6.tar.gz
    cd nginx-1.5.6
    ./configure --prefix=/usr/local/nginx-1.5.6 
    --with-http_stub_status_module 
    --with-http_gzip_static_module
    make && make install

    配置Nginx

    找到nginx.conf,写入如下内容

    server {
            #这里是访问时用到的端口
            listen       80;
            server_name  localhost;
    
            charset UTF-8;
    
            client_max_body_size 75M;
            location / {
                    include uwsgi_params;
                    #同uwsgi内容
                    uwsgi_pass 127.0.0.1:8080;
                    #链接超时时间
                    uwsgi_read_timeout 30;
            }
        }

    如此一来,重启你的nginx,访问80端口,就能看到效果了。

    还有问题?

    你可能发现了,你网页上的静态资源无法访问!!比如说admin页面,会特别简陋,这是因为nginx+uwsgi+Django时,Django对静态资源的处理nginx不能代理(可能吧)。总之这种事不该让Django做,因为nginx在处理静态资源上能力更强,对于静态资源,就让nginx处理吧。 
    通常来说,你会有两种静态资源/media/开头的链接和/static/开头的。static用来处理一些网站原始图片,视频,js,css文件,Django是自己就支持这种链接的。那么如何关闭让Django处理/static/开头的文件呢,很简单,在setting.py中将DEBUG值改为False,这时,Django就不去处理/static/文件了。 
    那么/media/呢?一般来说,用户上传的图片,我们会保存起来,在网页上显示时候就用/media/,在setting.py中设置

    MEDIA_URL = '/media/' #访问的前缀链接
    MEDIA_ROOT = os.path.join(BASE_DIR, '../media') #存放文件的具体位置

    再在url.py中添加

    from django.conf import settings
    from django.conf.urls.static import static
    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

    这里的意思是在DEBUG=True时,会解析/media/文件,文件存放的位置是第二个参数。 
    如此一来当即在部署为生产环境时,只需要吧DEBUG改为False,Django就不会去处理staticmedia了。

    收集静态文件

    Django有一个工具可以将应用里用到的所有静态文件收集起来,方便nginx解析。具体: 
    setting.py中设置STATIC_ROOT = os.path.join(BASE_DIR, '../collectedstatic') 
    这样收集的静态文件就都放进上面的目录里了。如何运行这个工具?python3 manager.py collectstatic

    配置nginx解析静态文件

    同样,nginx.conf 
    首先,在文件顶部加入 
    user root 
    声明让root用户跑nginx,否则访问静态文件可能提示没有权限 
    其次,在上面说的配置文件location /前加入以下带内容

          location /static/ {
                autoindex on;
                alias /root/SchoolBuyWeb/collectedstatic/;
            }
    
            location /media/ {
                autoindex on;
                alias /root/SchoolBuyWeb/media/;
            }

    注意alias后对应好自己设定的目录即可! 
    重启nginx,现在已经ok了~~

    重启uWSGI服务器

    There are several ways to make uWSGI gracefully restart.
    有几种方法完美重启uWSGI。

    # using kill to send the signal

    #使用kill发送信号

    kill -HUP `cat /tmp/project-master.pid`     (好用)

    # or the convenience option --reload

    #或者使用简单选项 --reload

    uwsgi --reload /tmp/project-master.pid

    # or if uwsgi was started with touch-reload=/tmp/somefile

    #或者,如果uwsgi是使用touch-reload=/tmp/somefile启动

    touch /tmp/somefile

    Or from your application, in python:
    或者在Python程序里:

    uwsgi.reload()

    注意,如果要使用pid,需要在uwsgi启动参数中指定 --pidfile,如:

    #/etc/rc.local 修改自启动
    /usr/local/bin/uwsgi /var/www/html/mz_uwsgi.ini --pidfile /tmp/uwsgi.pid

    或者需要在mz_uwsgi.ini配置

    pidfile=/tmp/mz_uwsgi.pid

    sudo killall -9 uwsgi 这个命令也可以编辑杀死进程

    比reboot服务器方便。

    还有问题可以参考 http://www.runoob.com/django/django-nginx-uwsgi.html

  • 相关阅读:
    Design Patterns
    Interview
    ListView Optimization
    android onclick onLongClick ontouch dispatchTouchEvent onInterceptTouchEvent
    java hashcode equals
    Android res/raw vs assets
    HttpClient -- 血的教训
    How Android Draws Views
    元数据 metadata
    Git-2
  • 原文地址:https://www.cnblogs.com/richiewlq/p/8909358.html
Copyright © 2020-2023  润新知