windows 2008 R2 nginx+FastCGI+Django 部署

温馨建议软件使用版本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. 还有一些没有碰见的问题希望有心人能够留下你们的一些想法或者思路或者问题都可以。