精华内容
下载资源
问答
  • websocket Django Nginx Windows Server 2012 R2 看本人的这篇博客 https://blog.csdn.net/jjw_zyfx/article/details/89840111

    websocket Django Nginx Windows Server 2012 R2 

    看本人的这篇博客

    https://blog.csdn.net/jjw_zyfx/article/details/89840111

    展开全文
  • 基于Centos+uWSGI+Nginx部署Django项目(过程非常详细)

    万次阅读 多人点赞 2019-08-26 23:57:17
    基于uwsgi+nginx部署django项目 部署背景:之前开发了一个本地的个人blog项目,还未部署云服务器,有些功能还未完善,当然想着之后也会部署到云端,最近尝试在本地部署看看如何。公司上的项目考虑到其业务环境...

      部署背景:之前开发了一个本地的个人blog项目,还未部署云服务器,有些功能还未完善,先尝试在本地部署。本篇内容则是基于centos+uwsgi+nginx来部署项目,实现高性能web服务,其中还给出uwsgi和nginx分别部署在不同服务器上步骤,这一点,很多文章并未给出相关探讨。

    1、相关服务安装配置

    安装nginx。配置官方镜像源,这里baseurl里面有$basearch变量,用来检索yum命令安装所需要的包。

    $ vi /etc/yum.repos.d/nginx.repo
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1
    $ yum -y install nginx
    $ systemctl enable nginx
    

    安装python3.6,采用python虚拟环境部署项目,跟系统不冲突

    $ yum -y install python36 python36-devel
    # 配置并载入 Python3 虚拟环境
    $ cd /opt
    # 在这里不需要将centos默认python2.7版本配置为默认python3.6
    # 直接使用python3.6作为启动命令即可,可避免冲突
    $ python3.6 -m venv py36  # py3 为虚拟环境名称, 可自定义
    # 退出虚拟环境可以使用 deactivate 命令
    $ source /opt/py36/bin/activate  
    (py36) [root@nn py36]# ls
    bin  include  lib  lib64  pyvenv.cfg
    # 载入环境后默认以下所有命令均在该虚拟环境中运行
    (py3) [root@localhost py3]
    # 安装 Python 库依赖
    $ pip install --upgrade pip setuptools
    $ pip install -r requirements.txt
    

    安装uwsgi

    # uwsgi需要使用gcc环境编译否则无法安装成功
    yum install gcc -y
    
    # 激活py36环境
    (py36) [root@nn mywebapp]# pip install uwsgi
    Successfully installed uwsgi-2.0.18
    

    数据库安装和配置可以参考本人这篇文章

    以上后台技术栈的相关版本总揽如下:

    Centos 7.5
    MariaDB 10.3.17
    Python 3.6
    Django1.11
    uWSGI 2.0.18
    Nginx 1.12.2
    Redis 5.0.4
    

    这些服务都是部署同一台服务器上,适合单台的个人云服务器,毕竟一年几百元,服务器配置有限,而对于本地部署,可以通过多台linux虚拟机分别部署不同服务,并做HA,这一过程相信也会积累不少知识和经验,学有余力的同学一定要试试。

    2、配置uwsgi启动django项目

    2.1 uwsgi 命令行启动项目

    查看项目,对项目路径必须清楚那些文件在哪里路径下,否则使用uwsgi启动设置参数,容易出错,以本项目为例,项目根目录路径为:/opt/mywebapp,项目根目录内容:

    (py36) [root@nn mywebapp]# pwd
    /opt/mywebapp
    (py36) [root@nn mywebapp]# ls
    account  blog    db.sqlite3  __init__.py  media   script  templates
    article  course  image       manage.py    mysite  static
    

    其中非常关键的wsgi入口,在mysite目录下,也就是django项目总settings.py所在的目录,mysite目录下的wsgi.py,将在之后的uwsgi启动中使用

    (py36) [root@nn mysite]# ls
    __init__.py  __pycache__  settings.py  urls.py  wsgi.py
    

    wsgi.py代码逻辑:

    """
    WSGI config for mysite project.
    It exposes the WSGI callable as a module-level variable named ``application``.
    For more information on this file, see
    https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/
    """
    import os
    from django.core.wsgi import get_wsgi_application
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    application = get_wsgi_application()
    

    确认项目使用manage.py启动能正常运行
    python manage.py runserver 0.0.0.0:9000

    使用uwsgi启动项目并测试是否成功运行django项目,通过连接mysite/wsgi.py实现web server和application通信

    这里有两种启动方式:

    A、不带静态文件启动,静态文件将无法加载,页面不正常显示

    –chdir /opt/mywebapp/ django项目根路径
    wsgi-file mysite/wsgi.py django项目settings.py所在目录下的 wsgi.py文件

    uwsgi --http 0.0.0.0:9000 --chdir /opt/mywebapp/ --wsgi-file mysite/wsgi.py --master --processes 4 --threads 2
    

    B、带静态文件启动,也就是网页打开后,页面能正常显示

    –chdir /opt/mywebapp/ django项目根路径
    wsgi-file mysite/wsgi.py django项目settings.py所在目录下的 wsgi.py文件
    –static-map=/static=static django项目web页面静态文件,所在根目录的’static’目录
    –static-map=/static=media django项目内容静态文件,所在根目录的’media’目录

    注意:这里仅是指static、media目录,根目录下还有其他blog,account,templates目录等,可能也有人会问,是不是都需要把这些目录都要一一加入–static-map里面,答案是不需要,因为这些都不是django application对应的“static”目录(已在settins设定,并可以让其他views索引到static目录),如果使用-static-map=/static=templates,uwsgi将无法找到相关静态文件

    uwsgi --http 0.0.0.0:9000 --chdir /opt/mywebapp/ --wsgi-file mysite/wsgi.py --static-map=/static=static --master --processes 4 --threads 2
    

    注意,对于这种启动方式,动、静态资源都可以访问

    2.2 使用uwsgi.ini配置文件启动项目

    以上两种启动直接在命令加入环境参数,比较繁琐,可通过在配置文件中放置这些环境参数,方便启动,在manage.py 同目录下(项目根目录),新建一个目录uwsgi_conf用来放置uwsgi.ini配置文件,目录路径:/opt/mywebapp/uwsgi_conf

    (py36) [root@nn mywebapp]# ls
    account  blog    db.sqlite3  __init__.py  media   uwsgi_conf  templates
    article  course  image       manage.py    mysite  static
    

    在uwsgi_conf目录下新建uwsgi.ini文件,配置如下

    # uwsig使用配置文件启动
    [uwsgi]
    # 项目所在的根目录
    chdir=/opt/mywebapp/
    # 指定项目的application,区别于启动命令--wsgi-filemysite/wsgi.py
    module=mysite.wsgi:application
    #the local unix socket file than commnuincate to Nginx
    # 指定sock的文件路径,这个sock文件会在nginx的uwsgi_pass配置,用来nginx与uwsgi通信       
    # 支持ip+port模式以及socket file模式
    #socket=%(chdir)/uwsgi_conf/uwsgi.sock
    socket=127.0.0.1:9001
    # 进程个数       
    processes = 8
    # 每个进程worker数
    workers=5
    procname-prefix-spaced=mywebapp                # uwsgi的进程名称前缀
    py-autoreload=1                              # py文件修改,自动加载
    
    # 指定IP端口,web访问入口
    http=0.0.0.0:9000
    
    # 指定多个静态文件:static目录和media目录,也可以不用指定该静态文件,在nginx中配置静态文件目录
    # uwsgi有自己的配置语法,详细可参考官网,无需写绝对路径,可以用循环、判断等高级配置语法
    for =static media
    static-map=/static=%(chdir)/%(_)
    endfor =
    
    # 启动uwsgi的用户名和用户组
    uid=root
    gid=root
    
    # 启用主进程
    master=true
    # 自动移除unix Socket和pid文件当服务停止的时候
    vacuum=true
    
    # 序列化接受的内容,如果可能的话
    thunder-lock=true
    # 启用线程
    enable-threads=true
    # 设置一个超时,用于中断那些超过服务器请求上限的额外请求
    harakiri=30
    # 设置缓冲
    post-buffering=4096
    
    # 设置日志目录
    daemonize=%(chdir)/uwsgi_conf/uwsgi.log
    # uWSGI进程号存放
    pidfile=%(chdir)/uwsgi_conf/uwsgi.pid
    #monitor uwsgi status  通过该端口可以监控 uwsgi 的负载情况
    # 支持ip+port模式以及socket file模式
    # stats=%(chdir)/uwsgi_conf/uwsgi.status 
    stats = 127.0.0.1:9001
    

    之所以要新建一个uwsgi_conf目录,是为了集中放置uWSGI配置以及日志、进程等文件,方便管理,配置语法可参考官方配置文档说明

    基于配置文件uwsgi启动django项目

    (py36) [root@nn uwsgi_conf]# uwsgi --ini uwsgi.ini 
    # 启动后打印的信息,可以看到static静态文件和media媒体资源目录被uWSGI索引
    [uWSGI] getting INI configuration from uwsgi.ini
    [uwsgi-static] added mapping for /static => /opt/mywebapp/static
    [uwsgi-static] added mapping for /static => /opt/mywebapp/media
    
    # 运行后,自动参数日志、进程,建议自行查看日志文件内容,了解更多uwsgi
    (py36) [root@nn uwsgi_conf]# ls
    uwsgi.ini  uwsgi.log  uwsgi.pid 
    
    # 停止uwsgi服务
    (py36) [root@nn uwsgi_conf]# uwsgi --stop uwsgi.pid
    

    以上说明使用uWSGI配置启动django项目成功运行,因uWSGI的配置文件里已加入静态文件static-map,因此在不需要nginx的配置下,也可以支撑服务(只是性能未到完美级别),此部分的流程如下图所示:
    在这里插入图片描述

    下面将使用nginx配置静态文件请求,uwsgi只负责动态请求部分的请求,各司其职,以进一步压榨服务性能。如果确定使用nginx代理django项目静态文件服务,那么配置之前,先把uwsgi.ini里面的–static-map=/static部分注释掉。

    3、使用nginx启动uwsgi

    3.1 配置nginx

    在/etc/nginx/conf.d/,新建一个myblog.conf文件,配置为:

    upstream blog_app {
       # nginx通过socket在环回接口地址的9001端口与本地的uWSGI进程通信
       # 支持ip:port模式以及socket file模式
       #server unix:/opt/mywebapp/uwsgi_conf/uwsgi.sock;
       server 127.0.0.1:9001;
    }
    
    server {
    
        listen 9090;
        server_name 192.168.100.5;
        
        access_log /var/log/nginx/access.log;
        charset utf-8;
      
        gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
    
        location / {
            # nginx转发动态请求到uWSGI
            include uwsgi_params;
            uwsgi_connect_timeout 20; 
            uwsgi_pass blog_app;
        }
        
        # 如果写成/static/,nginx无法找到项目静态文件路径
        location /static {
            alias /opt/mywebapp/static;
        }
        
        # 如果写成/media/,nginx无法找到项目媒体文件路径
        location /media {
            alias /opt/mywebapp/media;
        }
    
    
    }
    

    重启nginx服务,server nginx restart,只要在第2部分uWSGI与django application正常连接,那么到这部分,nginx是能够正常代理uWSGI服务的,如有问题,请认真检查nignx的在/etc/nginx/conf.d/myblog.conf配置文件。
    这里要解释为何配置可以放在/etc/nginx/conf.d/目录下,网上不是有很多教程是在/etc/nginx/nginx.conf默认配置文件改动吗?
    其实nginx配置文件很灵活,可以从其他模块include根配置文件里面,查看主配置nginx.conf内容里面的http 模块,它可以是可以把/etc/nginx/conf.d/目录下所有的配置文件内容包含到主配置文件里面,注意如果使用这种方式,请把主配置文件server模块注释,其实就是关闭多余其他服务端口而已。

    # 要确保nginx用户对django项目根目录下静态文件具有读权限,否则会出现403 Forbidden
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    # Load dynamic modules. See /usr/share/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    events {
        worker_connections 1024;
    }
    
    http {
        ......省略
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        include /etc/nginx/conf.d/*.conf;
        ......省略
    	#server  {
        ......省略
        #		}    
        }
        
        
    

    3.2 关于myblog.conf路径放置

    理解了nginx的include配置文件方式,那么我们可以不需要在/etc/nginx/conf.d/目录下创建myblog.conf,直接在django项目的根目录下mywebapp/,新建一个nginx_conf目录,在这里放置myblog.conf,

    [root@nn nginx_conf]# pwd
    /opt/mywebapp/nginx_conf
    [root@nn nginx_conf]# ls
    myblog.conf
    

    然后把该配置路径/opt/mywebapp/nginx_conf/myblog.conf 加入到nginx默认的主配置文件里面

    http {
        ......省略
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # 不再是 include /etc/nginx/conf.d/*.conf;
        include /opt/mywebapp/nginx_conf/myblog.conf;
        ......省略
    	#server  {
        ......省略
        #		}    
        }
    

    server nginx restart重启服务,nginx首先解析主配置文件/etc/nginx/nginx.conf,发现主配置里面,include了在其他位置的配置文件,于是nginx找到myblog.conf并加载,接着完成一些列其他逻辑。以上两种nginx配置都可以连接uWSGI服务,至于选哪种方式,看个人需求或项目文件管理习惯。

    3.3 nginx+uWSGI+django启动后,访问media目录的图片、文件、视频出现403 forbidden提示

    这个问题,在csdn绝大部分nginx+uWSGI+django部署文章都没提及如何处理,因为大部分文章没有测试到这部分内容,只是测试nginx可以正常获取static目录下的js、css、html文件,页面显示正常即结束,但如果项目的代码中,例如有视频课程这么一个功能,上传视频是放在media目录下的course目录里,那么当网页访问该视频时,就会提示该资源403 forbidden状态。
    原因:nginx worker对media整个目录没有读权限
    nginx默认使用名字为“nginx”用户,这一点可在其主配置文件找到,也可以通过进程详情看到

    [root@nn mywebapp]# ps -ef|grep nginx
    root     28759     1  0 02:01 ?        00:00:00 nginx: master process /usr/sbin/nginx
    nginx    28760 28759  0 02:01 ?        00:00:00 nginx: worker process
    root     28784 28382  0 02:26 pts/0    00:00:00 grep --color=auto nginx
    

    再看mywebapp/media权限,指向root用户

    -rwxr-xr-x.  1 root  root     804 ** manage.py
    drwxr-xr-x.  4 root  root     49 ** media
    drwxr-xr-x.  3 root  root      93 ** mysite
    drwxr-xr-x.  9 root  root     113 ** static
    

    故需要将相关目录的读权限给到nginx用户,对django项目根目录下的static、media两个目录赋权给nginx user

    [root@nn mywebapp]# chown -R nginx:nginx /opt/mywebapp/static/
    [root@nn mywebapp]# chmod -R ug+r /opt/mywebapp/static/
    [root@nn mywebapp]# chown -R nginx:nginx /opt/mywebapp/media/
    [root@nn mywebapp]# chmod -R ug+r /opt/mywebapp/media/
    

    聪明的同学可能此时会立刻联想到:既然nginx访问django项目静态文件要赋权,那么前面第2部分的uWSGI进程也是否需要赋权呢?答案:需要看uwsgi.ini配置了什么用户。

       uid=root
       gid=root
    

    这里配置了root用户,而且对于django整个项目文件的rwx权限,root用户本已具备,因此不需要再赋权,除非uwsgi.ini配置了一个非root用户,例如blog_user用户,那么就需要重启赋权,目录是整个django项目,例如以下可行的赋权:

    [root@nn mywebapp]# chown -R blog_user:blog_user /opt/mywebapp
    [root@nn mywebapp]# chmod -R ug+r /opt/mywebapp
    

    第3部分的请求流程可以表示为:
    在这里插入图片描述

    4、关于nginx配置django的静态文件讨论

    关于静态文件的配置,其过程有些地方非常容易引起混淆,在这里一一指出。
    首先,在本文中,nginx服务和uWSGI服务部署在同一台服务器,因此在nginx配置中,location的静态文件因为的是本地django项目里面的静态文件,个人把这种配置过程nginx代理本地静态文件配置,另外一种django项目里面的静态文件放置在远程服务器上,由远程的nginx来代理,这种称为nginx代理远程静态文件配置。
    为什么要做这样的部署测试?
    大部分文章都是基于同一台服务器进行nginx服务和uWSGI服务部署,很少有讨论在不同服务器上部署,事实上,如果生产环境比较严格,nginx服务器本身要做冗余和负载均衡,uWSGI服务器也是要做冗余和负载均衡,数据库MariaDB本身主-主模式。

    4.1 nginx代理本地静态文件配置

    在第三部分的uWSGI的配置文件中,socket配置为loopback地址,说明uWSGI进程与nginx进行本地通信,nginx代理本地静态文件。在第3部分可测试过程中,除了http://192.168.100.5:9090/admin无法正常显示页面(所有关于admin管理页面后台的静态文件nginx无法找到),其他子路径例如http://192.168.100.5:9090/blog,http://192.168.100.5:9090/article,都可以正常显示页面,这种情况如何处理?
    从nginx配置的项目静态文件路径为:

        # 如果写成/static/,nginx无法找到项目静态文件路径,注意避免配置语法出错
        location /static {
            alias /opt/mywebapp/static;
        }
    

    查看其目录文件,发现并没有django项目admin的后台所需的静态文件

    [root@nn mywebapp]# ls
    account     blog        image        media   
    all_static  course      __init__.py  mysite  templates
    article     db.sqlite3  manage.py    static  uwsgi_conf
    [root@nn mywebapp]# ls static
    css  editor  fonts  images  ImgCrop  js
    

    通过python manage.py collectstatic将admin后台包含所有的静态文件都拷贝到mywebapp根目录下,在执行命令之前,需要在settings.py设置一个放置整个mywebapp项目静态文件目录

    • 原静态文件目录的设置:
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, "static"),
    )
    
    
    • 加入admin静态文件的设置
    STATIC_URL = '/static/'
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, "static"),
    )
    
    STATIC_ROOT='all_static'
    

    注意:若STATIC_ROOT=‘static’,collect无法拷贝admin静态文件到项目中,会有提示

    # django.core.exceptions.ImproperlyConfigured: The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting
    

    能否在settings.py不指定STATIC_ROOT,利用已指定的mywebapp/static目录放置collect static?不行,看以下提示

    # django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.
    

    当正确拷贝所有静态文件到mywebapp/all_static目录后,查看其内容:

    (py36) [root@nn mywebapp]# ls all_static/
    admin  css  editor  fonts  images  ImgCrop  js
    

    原来 python manage.py collectstatic 把项目下的static目录静态文件和django自带的后台admin静态文件打包一起放在/mywebapp/all_static目录里。
    就个人对项目目录管理习惯而言,把all_static/下的admin目录整个拷贝到static目录下,并删除all_static目录,settings的静态文件路径注释掉STATIC_ROOT='all_static'这样既可保持整个django项目仅有一个static目录,而且该目录已经包含项目所需的所有静态文件(js、css、html等),注意media目录路径不做改变,还是位于根项目路径下。

    4.2 远程静态目录配置

    4.2.1 拷贝静态文件到远程nginx服务器

    如果已经理解了nginx代理本地静态文件的配置,其实远程方式其实也简单,本文的远程nginx服务器地址为192.168.100.6,在创建与uWSGI相同的application目录(可以使用不同路径,这里是为方便管理):/opt/mywebapp/,该目录只放置static和media目录,文件可以手工同步过来,注意要赋权给nginx用户

    [root@dn1 mywebapp]# ls -al
    total 0
    drwxr-xr-x. 4 root  root   33 Aug 17 20:29 .
    drwxr-xr-x. 3 root  root   67 Aug 17 20:03 ..
    drwxr-xr-x. 4 nginx nginx  35 Aug 19  2019 media
    drwxr-xr-x. 9 nginx nginx 113 Aug 18  2019 static
    
    [root@dn1 mywebapp]# ls static/
    admin  css  editor  fonts  images  ImgCrop  js
    [root@dn1 mywebapp]# ls media/
    courses  images
    
    4.2.2 更改.5uWSGI服务器配置文件socket
    [uwsgi]
    # 项目所在的根目录
    chdir=/opt/mywebapp/
    # 指定项目的application,区别于启动命令--wsgi-filemysite/wsgi.py
    module=mysite.wsgi:application
    # 不再使用loopback地址,对外其他服务器暴露uWSGI服务
    socket=192.168.1005:9001
    
    4.2.3 更改.6服务器的nginx配置文件,

    为了方便管理,路径与uWSGI一致:
    /etc/nginx/conf.d/myblog.conf
    远程nginx服务器配置文件

    upstream blog_app {
       # 连接远程uWSGI服务器的socket 
       server 192.168.88.5:9001;
    }
    
    server {
        listen 9090;
        server_name 192.168.100.6;
        access_log /var/log/nginx/access.log;
        charset utf-8;
        gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
    
        location / {
            include uwsgi_params;
            uwsgi_connect_timeout 30;
            uwsgi_pass ;
        }
        # 这就是为何在远程nginx服务器上,保持与uWSGI静态文件路径一致的原因,方便管理和理解配置文件
        location /static {
            alias /opt/mywebapp/static;
        }
        
        location /media {
            alias /opt/mywebapp/media;
        }
    }
    

    以.6IP访问动态资源和静态,可以正常请求。

    5 、关于sock文件的理解

    在uwsgi.ini和nginx配置文件里面,我们需要配置socket,以便他们之间进行进程通信,这里socket的配置方式,可以选择一个以.sock作为后缀的文件,而大家更熟悉的方式是通过socket pair进行socket通信,这里如何理解sock文件?
    这里整理收集的资料概括为:

    在Unix/Linux系统里面,“一切皆文件”,这里文件是由什么组成的?这些文件其实是可以读取和写入的普通字节(字节流)的集合。如果你持有一个文件引用(也就是文件描述符),就可以使用“打开open –> 读写write/read –> 关闭close”模式(抽象成一组Linux 文件操作API)来进行 IO 操作,无论设备的类型和底层硬件是什么。

    所以进程(进程本身也是文件)之间的通信。个人理解uwsgi.sock文件用到的就是该模式的一个实现,socket就是这么一种特殊的套接字文件,也即是说nginx通过uwsgi.sock作为载体,与本地的uWSGI进程进行通信。

    这种基于特殊的套接字文件来保持通信是无法进行远程通信,这时需要用到TCP/IP协议,通过远程IP+端口号的socket pair,基于TCP连接进行远程通信(若用loopback的IP地址127.0.0.1,就变成本地通信),所以这启发我们可以将nginx部署在另外一台服务器上,本文中,uWSGI+application部署在192.168.100.5,另外一台服务器192.168.100.6 作为nginx服务器,要实现他们之间的远程通信,
    只需uwsgi配置文件uwsgi.ini里面socket行改为:

    #the local unix socket file than commnuincate to Nginx
    # 指定sock的文件路径,则限制本地通信
    # 指定loopback 地址+端口号,则限制本地通信
    # 指定全网地址或者本机真实IP,则可以实现远程通信
    socket=192.168.100.5:9001
    

    在.6服务器上,nginx的配置myblog.conf的upstream模块个改为

    upstream blog_app {
     # 指向远程uWSGI
       server 192.168.100.5:9001;
    }
    

    通过以上设置,可以把static静态文件目录和media目录放置在远程.6的nginx服务器上,.5服务器则负责application业务逻辑,两服务器之间的静态文件可以通过rsync实时同步。rsync的配置不再给出,也可参考本blog文章

    若考虑对uWSGI做负载均衡,比如第二台uWSGI服务器192.168.100.4:9001;可以加入upstream并设定相关负载算法,若还考虑对nginx服务器进行负载均衡,则需要用keepalived,通过VIP对外透明服务,负载均衡的配置会更有趣。

    展开全文
  • 温馨建议软件使用版本python3.4、Django1.7、nginx1.2、flup1.0.3, 使用这三个版本是有原因的否则我也不会这样,在windows 上面我能考虑用这种情况是因为我刚开始使用apache+mod_wsgi进行部署的但是不知道什么原因...

    温馨建议软件使用版本python3.4、Django1.7、nginx1.2、flup1.0.3, 使用这三个版本是有原因的否则我也不会这样,在windows 上面我能考虑到用这种情况是因为我刚开始使用apache+mod_wsgi进行部署的但是不知道什么原因愣是有个问题没办法解决,我本以为是版本问题后来更换版本也不行,在httpd.conf文件进行module加载的时候路径正确也读不出来,直接导致服务无法启动,有人说去自动生成一个模板路径但是还是不行;再后来我去使用nginx+uwsgi进行部署使用,这时候又出现一个问题window系统上面没办法安装uwsgi资源库,没办法只能放弃上面两种办法了。

    1. ngin安装及配置
    2. nginx下载地址:http://nginx.org/en/download.html

    3. 进行nginx解压,我这块解压路径C:\Program\nginx-1.12.2;

    4. 然后去下载一个安装nginx的神器,windows service wrapper,这块藐视现在只有1.9版本的winsw-1.9-bin.exe。把它放在这个解压目录下创建一个winsw文件;

    5. 然后在该目录下创建与神器名字相同的xml文件winsw-1.9-bin.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <service>
      <id>nginx</id>
      <name>nginx</name>
      <description>nginx</description>
      <executable>C:\Program\nginx-1.12.2\nginx.exe</executable>
      <logpath>C:\Program\nginx-1.12.2\</logpath>
      <logmode>roll</logmode>
      <depend></depend>
      <startargument>-p C:\Program\nginx-1.12.2</startargument>
      <stopargument>-p C:\Program\nginx-1.12.2 -s stop</stopargument>
      </service>
      
      
    6. 进入该C:\Program\nginx-1.12.2\winsw\文件下安装服务:

      winsw-1.9-bin.exe install
      
    7. 配置conf/nginx.conf文件主要配置服务:

      server {
              listen       80;
              server_name  localhost;
      
              #charset koi8-r;
      
              #access_log  logs/host.access.log  main;
      
              location / {
                  root   index;
                  index  index.html index.htm;
              }
      
              #error_page  404              /404.html;
      
              # redirect server error pages to the static page /50x.html
              #
              error_page   500 502 503 504  /50x.html;
              location = /50x.html {
                  root   html;
              }	
              #重点在这,这个路径是你创建的Django项目的主文件路径
      		location ~* ^.+\.(html|jpg|jpeg|gif|png|ico|css|js)$  
              {  
                  root D:/myjango;  
                  expires 30d;  
                  break;  
              }  
        		# 加载静态资源路径
              location ~ ^/static/ {  
                  root D:/myjango;  
                  expires 30d;  
                  break;  
              }   
        		# fastcgi 配置相关的ip和端口方便去调用
              location ~ ^/ {  
                  fastcgi_pass 127.0.0.1:8051;  
                  fastcgi_param PATH_INFO $fastcgi_script_name;  
                  fastcgi_param REQUEST_METHOD $request_method;  
                  fastcgi_param QUERY_STRING $query_string;  
                  fastcgi_param CONTENT_TYPE $content_type;  
                  fastcgi_param CONTENT_LENGTH $content_length;  
                  fastcgi_param SERVER_PROTOCOL $server_protocol;  
                  fastcgi_param SERVER_PORT $server_port;  
                  fastcgi_param SERVER_NAME $server_name;  
                  fastcgi_pass_header Authorization;  
                  fastcgi_intercept_errors off;  
              } 
        }
      
    8. negix常用命令

      启动命令:start negix
      停止命令: negix -s quit
      
    2.FastCGI安装

    2.1 FastCGI安装用的是flup,可直接用pip3 安装版本最新版是1.0.3。1.0.2主要是用在py2上的如果用在py3中会出现安装中的错误。

    pip3 install flup
    

    2.1 在项目目录下运行该程序

    manage.py runfcgi method=threaded host=127.0.0.1 port=8051
    

    在项目运行中尽量不要使用Django,太高版本的操作否则会出现你意向不到的问题,如果正常执行完这个命令项目是没有任何反应和提示信息的,否则就出错误了。

    问题归纳:

    1. 路由配置

      在Django路由配置方面尽量使用django.conf.urls 下面的url进行配置

      基本规则示例如下:

    from django.contrib import admin
    from django.conf.urls import url,include
    from index.views import *
    
    urlpatterns = [
        url(r'^admin/$', admin.site.urls),
        url(r'', include('index.urls')), # 引入另一个应用urls
    ]
    
    1. settings.py配置

      在setting配置中主要就是要配置DEBUG改为False,还有一个东西很重要,看下面:

      不知道在那个版本的Django框架中MIDDLEWARE_CLASSES被改成了MIDDLEWARE导致在runfcgi时会报没有在MIDDLEWARE_CLASSES中配置’django.contrib.sessions.middleware.SessionMiddleware’, ‘django.contrib.auth.middleware.AuthenticationMiddleware’, ‘django.contrib.messages.middleware.MessageMiddleware’,这三个参数,导致错误,不能继续编译。

      MIDDLEWARE = [
          'django.middleware.security.SecurityMiddleware',
          'django.contrib.sessions.middleware.SessionMiddleware',
          'django.middleware.common.CommonMiddleware',
          'django.middleware.csrf.CsrfViewMiddleware',
          'django.contrib.auth.middleware.AuthenticationMiddleware',
          'django.contrib.messages.middleware.MessageMiddleware',
          'django.middleware.clickjacking.XFrameOptionsMiddleware',
      ]
      
      MIDDLEWARE_CLASSES = [
          'django.contrib.sessions.middleware.SessionMiddleware',
          'django.contrib.auth.middleware.AuthenticationMiddleware',
          'django.contrib.messages.middleware.MessageMiddleware',
      ]
      
    2. 项目分页情况

      在Django2.0.3版本使用下面方法就可以完成分页:

      from django.core.paginator import Paginator
      	paginator = Paginator(article, 4)
          page = request.GET.get('page')
          art = paginator.get_page(page)
      

      在Django1.7版本以前可以使用下面方法来完成:

      from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
      	page = request.GET.get('page')
          #art = paginator.page(page)
          try:
              art = paginator.page(page)
          except PageNotAnInteger:
              art = paginator.page(1)
          except EmptyPage:
              art = paginator.page(paginator.num_pages)
      

      出现这这种原因是因为Django版本更新去掉了一些复杂的方法简化了,所以之前的版本就不能用了。

    3. 还有一些没有碰见的问题希望有心人能够留下你们的一些想法或者思路或者问题都可以。

    4. django 样式丢失问题点击此处去往查看问题解决方案。

    展开全文
  • windows系统中,xadmin后台样式能正常加载,部署到centos后就不能加载了,解决方法: 1.在django项目中的settings.py文件后面,添加: STATIC_ROOT = ‘/usr/local/src/webroot/blog/static/’ 2、nginx配置文件...

    在windows系统中,xadmin后台样式能正常加载,部署到centos后就不能加载了,解决方法:

    1.在django项目中的settings.py文件后面,添加:

    STATIC_ROOT = ‘/usr/local/src/webroot/blog/static/’  
    

    2、nginx配置文件nginx.conf,添加:

    location /static/ {
        root /usr/local/src/webroot/blog/;
        break;
    }
    

    3、运行搜集静态文件的命令,搜集后的静态文件存放在/usr/local/src/webroot/blog/static/目录中:

    python manage.py collectstatic
    

    4、重启uwsgi和nginx

    在这里插入图片描述

    展开全文
  • 是否曾想过把django项目从windows移植Linux上运行,Linux性能众所周知,作为Django运行的服务器再合适不过啦,今天分享一下如何在线上云机器的Linux环境运行Django项目。 客户端访问服务端的流程 1.首先客户端请求...
  • https://blog.csdn.net/sunhuaqiang1/article/details/70185022一、nginx安装  首先,到nginx官网(http://nginx.org)上...解压 E:\Win7nginx-apache-django\nginx-1.10.3下面然后,进入window的cmd窗口,1、进...
  • Django项目部署(一)

    2020-12-22 14:49:38
    windows系统中开发的django项目部署到centos系统中 并且可以在浏览器中可以访问项目 详细步骤(下面步骤都是ROOT权限执行): 1) 先安装python 2) 安装pip 3) 安装django 4) 把项目从windows系统拷贝到centos系统...
  • 前面写过一篇文章,ngixn,uwsgi,django,python 环境配置,有兴趣的朋友可以参考 nginx,django部署 后来有人在QQ上问我,用Apache 好部署吗?我当时只在windows下用 APACHE2.3,django1.4,wsgi 部署过,还没有在 linux ...
  • 前言:自己在windows上用PyCharm编写的Django项目,编写完后在windows上运行一点问题都没有,但是部署到服务器上时却Bug百出。百度,CSDN,sf,各种搜索寻求解决方案在历时3天后终于让它在服务器上与在windows的运行...
  • 本教程使用的本地环境为 Windows 10,服务器环境为 ubuntu 14.04(64 位)。如果你的环境和我的有所差异导致一些命令无法执行,将这些命令转换为你所在环境的命令执行即可。 安装软件 顺利连接远程服务器了。...
  • 上课时带着大家一起完成每一个案例,通过老师的实操来掌握某个知识点的应用,以及出现错误之后的解决方法 本课程的运行环境主要使用Linux为内核的centos7系统 也会涉及到windows系统使用的是pycharm2018版本的 ...
  • 我写了一个django项目 想部署到Windows服务器上 但是在Pycharm上时可以用localhost:80/login/访问, 但是在nginx上只能用localhost:80/login.html来访问 这样的话很多连接就失效了 我该怎么部署 D:\...
  • 折腾了一下午,总算把django项目部署到apache中了,在这里做下简单的小结。本文不做详细介绍,只是把要注意的事项强调一下。 方案 本来打算使用nginx+gunicorn+django启动项目,但是发现安装gunicorn之后,无法运行...
  • 老师的讲课风格主要是以实操为主,上课时带着大家一起完成每一个案例,通过老师的实操来学习某个知识点的应用,以及出现错误之后的解决方法本课程的运行环境主要使用Linux为内核的centos7系统也会涉及到windows系统...
  • Django项目部署到云服务器 花了好长时间才搞定的,这路上到处都是坑呀 1,准备工作: ①,需要一台云服务器,我用的是腾讯的云服务器。系统:Centos 7,其实都差不多。 ②,所需软件。为了避免出错,尽量使...
  • django生产环境部署

    2019-03-20 22:12:44
    最近尝试进行一些python web生产环境部署的任务。主要是使用django框架进行web开发。本地使用windows + python3.7可是上服务器...一般来说,部署一个django web项目需要部署,数据库,nginx, gunicorn和supervi...
  • Django2.1 + Python3.6 + nginx + uwsgi 部署到Ubuntu18.04 材料准备 准备一个Django项目准备一台Ubuntu18.04的主机 ssh连接到主机(腾讯云) Mac直接在bash中输入ssh root@你的主机ip Windows请下载ssh远程连接工具...
  • Django2.1 + Python3.6 + nginx + uwsgi 部署到Ubuntu18.04 材料准备 准备一个Django项目 准备一台Ubuntu18.04的主机 ssh连接到主机(腾讯云) Mac直接在bash中输入ssh root@你的主机ip Windows请下载ssh远程连接...
  • 一、前提本地OS为WINDOWS,远程服务器OS为Centos 7.二、准备工作1.在本地与远程服务器上都安装python3;2.本地项目开发采用pycharm+Django搭配;3.远程服务器上安装uWsgi,nginx....
  • Django2.1 + Python3.6 + nginx + uwsgi 部署到Ubuntu18.04 材料准备 准备一个Django项目 准备一台Ubuntu18.04的主机 ssh连接到主机(腾讯云) Mac直接在bash中输入ssh root@你的主机ip Windows请下载ssh远程连接...
  • Django2.1 + Python3.6 + nginx + uwsgi 部署到Ubuntu18.04材料准备准备一个Django项目准备一台Ubuntu18.04的主机ssh连接到主机(腾讯云)Mac直接在bash中输入ssh root@你的主机ipWindows请下载ssh远程连接工具例如...
  • Django2.1 + Python3.6 + nginx + uwsgi 部署到Ubuntu18.04材料准备准备一个Django项目准备一台Ubuntu18.04的主机ssh连接到主机(腾讯云)Mac直接在bash中输入ssh root@你的主机ipWindows请下载ssh远程连接工具例如...
  • Django(part52)--项目部署

    2020-06-26 13:52:17
    文章目录项目部署项目部署的几个步骤安装同版本的数据库(略)django项目迁移安装python安装相同版本的包将当前项目源代码复制运程主机上(scp 命令)ssh远程登录云主机uWSGI 网关接口配置WSGI规范uWSGI网关接口配置...
  • Windows上安装Nginx注意事项

    千次阅读 2014-05-20 15:07:34
    本来想在windows7上安装Nginx,然后部署Django的,过程中遇到了一些小问题,所以都记录下来!供以后查阅!几个细节的东西,有必要写清楚! 官网上下载地址:http://nginx.org/en/download.html 就那最新...
  • flask属于轻量级python的web框架,其流行程度可以与django媲美。因为是轻量型,所以对于开发...1.使用虚拟环境创建flask项目在使用flask来开发项目时,为了保证项目移植的顺平性(如在windows中开发的项目移植li...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

djangonginx部署到windows