• 使用uWSGI+nginx部署Django项目


    最近使用django写了一些项目,不过部署到服务器上碰到一些问题,还有静态文件什么的一堆问题,这里总结一下碰到的问题和解决方案,总体思路是按照官方文档走的。

    原文地址:http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

    讲的很清楚,不过还是需要一些注意的地方

    对于uwsgi+nginx的部署方式,它的访问关系大概是:

    the web client <-> the web server <-> the socket <-> uwsgi <-> Django
    

      

    如果你需要使用virtualenv:

    virtualenv uwsgi-tutorial
    cd uwsgi-tutorial
    source bin/activate
    

      

    安装django:

    pip install Django
    django-admin.py startproject mysite
    cd mysite
    

      

    这里假设的你域名是:example.com,在后面的你可以换成你的域名或者IP地址。

    原教程中使用的是8000端口号,我们这直接使用80端口。

    基于uwsgi

    安装uwsgi

    pip install uwsgi
    

     

    先做个测试uwsgi是否能正常使用,创建一个test.py文件(在哪创你自己决定啊,反正配置完要删的):

    # test.py
    def application(env, start_response):
        start_response('200 OK', [('Content-Type','text/html')])
        return [b"Hello World"] # python3
        #return ["Hello World"] # python2
    

      

    下面我们使用uwsgi:

    uwsgi --http :8000 --wsgi-file test.py
    

      

    参数解释:

    http :8000:指示用的是8000端口

    wsgi-file test.py:加载指定文件 test.py

    然后你就可以尝试访问了:

    http://example.com:8000
    

      

    接下来我们在django项目上尝试一下

    新建的django项目需要先:

    python manage.py migrate
    python manage.py runserver

      

    如果能够运行:

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

      

    参数:

    module mysite.wsgi :指定wsgi

    尝试访问:

    http://example.com:8000
    

      

    现在的结构类似于:

    the web client <-> uWSGI <-> Django
    

      

    基于 nginx

    安装nginx

    sudo apt-get install nginx
    sudo /etc/init.d/nginx start    # start nginx
    

      

    也可以用nginx服务命令比如

    sudo service nginx start
    sudo service nginx stop
    sudo service nginx restart
    

      

    现在访问http://127.0.0.1/就能看到默认的nginx主页

    然后我们来配置nginx文件,先对原始配置文件做个备份

    sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
    

      

    然后编辑配置文件

    sudo vim /etc/nginx/sites-available/default
    

      

    # default
    
    # the upstream component nginx needs to connect to
    upstream django {
        # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
        server 127.0.0.1:8001; # for a web port socket (we'll use this first)
    }
    
    # configuration of the server
    server {
        # the port your site will be served on
        listen      80 default_server;
        listen      [::]:80 default_server ipv6only=on;
        # the domain name it will serve for
        server_name .example.com; # substitute your machine's IP address or FQDN
        charset     utf-8;
    
        # max upload size
        client_max_body_size 75M;   # adjust to taste
    
        # Django media
        location /media  {
            alias /path/to/your/mysite/media;  # your Django project's media files - amend as required
        }
    
        location /static {
            alias /path/to/your/mysite/static; # your Django project's static files - amend as required
        }
    
        # Finally, send all non-media requests to the Django server.
        location / {
            uwsgi_pass  django;
            include     /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
        }
    

    一下是我的配置信息供参考

    upstream django {
        server unix:///home/ubuntu/blogsite/mysite.sock; # for a file socket
        #server 127.0.0.1:8001; # for a web port socket (we'll use this first)
    }
    
    server {
            listen 80 default_server;
            listen [::]:80 default_server ipv6only=on;
    
            root /usr/share/nginx/html;
            index index.html index.htm;
    
            # Make site accessible from http://localhost/
            server_name localhost;
    
            charset utf-8;
    
            fastcgi_connect_timeout 300;
            fastcgi_send_timeout 300;
            fastcgi_read_timeout 300;
    
            client_max_body_size 75M;
    
            location /media {
                    alias /home/ubuntu/blogsite/media;
            }
    
            location /static {
                    alias /home/ubuntu/blogsite/static;
            }
    
            location / {
                    # First attempt to serve request as file, then
                    # as directory, then fall back to displaying a 404.
                    #try_files $uri $uri/ =404;
                    # Uncomment to enable naxsi on this location
                    # include /etc/nginx/naxsi.rules
                    uwsgi_pass      django;
                    include         /etc/nginx/uwsgi_params;
            }
    

      

    下面我们对django进行一下配置,编辑django配置文件mysite/settings.py 加上:

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

      

    这些配置信息具体用处可在我的另一篇文章中看到。

    然后执行命令

    python manage.py collectstatic
    

      

    然后重启nginx

    sudo /etc/init.d/nginx restart
    

      

    现在可以在django项目中放几个静态文件,看是否能访问:

    比如将一个media.png的图片放在mysite/media 文件夹中(没有media文件夹可以自己创建一个)

    然后访问

    http://example.com/media/media.png
    

      

    就能访问到这个图片。

    nginx,uwsgi和test.py

    还记得我们创建的test.py文件,现在我们再让它发挥一下作用

    再test.py 的目录下执行命令:

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

      

    这里使用的8001端口号跟上面的配置文件中的

    upstream django {
        # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
        server 127.0.0.1:8001; # for a web port socket (we'll use this first)
    }
    

    相对应,我们现在是用的端口socket所以使用下面的配置,以后会使用到文件socket

    然后我们访问网站就能看到test.py 文件返回的内容了

    这次我们的访问顺序类似于:

    the web client <-> the web server <-> the socket <-> uWSGI <-> Python
    

      

    注:如果上文中的8001端口不能使用可改用其他端口号

    使用unix sockets文件代替端口

    前面我们使用了tcp端口,十分简单,但是我们最好使用sockets文件,这样能减少资源消耗

    我们将default的配置稍作修改

    server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)
    

      

    然后在django目录中使用命令

    uwsgi --socket mysite.sock --wsgi-file test.py
    

    然后访问网站,

    注:如果不能访问(一般来说访问不了!!),我们check一下nginx的错误日志,

    vim /var/log/nginx/error.log
    

      

    如果在里面看到类似于

    connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
    denied)
    

      

    那是权限问题,我们改用下面的命令

    uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666
    

      

    如果能正常访问了,那我们来试试使用wsgi来访问django项目

    uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666
    

      

    然后我们使用.ini文件来配置uwsgi(差不多就能完成了),在项目目录下创建mysite_uwsgi.ini

    # mysite_uwsgi.ini file
    [uwsgi]
    
    # Django-related settings
    # the base directory (full path)
    chdir           = /path/to/your/project
    # Django's wsgi file
    module          = project.wsgi
    # the virtualenv (full path)
    #home            = /path/to/virtualenv
    
    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    processes       = 10
    # the socket (use the full path to be safe
    socket          = /path/to/your/project/mysite.sock
    # ... with appropriate permissions - may be needed
    chmod-socket    = 666
    # clear environment on exit
    vacuum          = true
    

      

    一下是我的配置,供参考

    [uwsgi]
    
    # Django-related settings
    # the base directory (full path)
    chdir           = /home/ubuntu/blogsite
    # Django's wsgi file
    module          = blogsite.wsgi
    # the virtualenv (full path)
    # home            = /path/to/virtualenv
    
    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    processes       = 2
    # the socket (use the full path to be safe
    socket          = /home/ubuntu/blogsite/mysite.sock
    # ... with appropriate permissions - may be needed
    chmod-socket    = 666
    # clear environment on exit
    vacuum          = true
    

    然后,跑起来

    uwsgi --ini mysite_uwsgi.ini
    

      

    以上,使用uWSGI+nginx部署Django项目就算是完成了,还有其它的配置可参考官方文档(比如怎样服务开机自启)

    http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

    欢迎多来访问博客:http://liqiongyu.com/blog

    微信公众号:

      

      

  • 相关阅读:
    正则表达式教程
    LINQ查询基本操作
    C# LINQ 基本操作实例
    Sublime Text 3 常用插件以及安装方法
    记一次矩阵列单元格合并和拆分组件的开发
    解析JavaScript函数的多种写法
    jQuery源码逐行分析学习02(第一部分:jQuery的一些变量和函数)
    jQuery源码逐行分析学习01(jQuery的框架结构简化)
    Vue IIS 403-Forbidden
    数组求和:二分递归
  • 原文地址:https://www.cnblogs.com/Liqiongyu/p/5893780.html
Copyright © 2020-2023  润新知