部署天天生鲜及问题

2019-09-28  本文已影响0人  上帝大人

基本环境

pip freeze >requirements.txt 打包本地安装的包文件(在本地环境中)
pip install - r requirements.txt 服务器中安装包(在服务器的虚拟环境中)

安装FastDFS

修改clinet.conf 里面的 tracker_server 为ip:22122
vim filename.txt
fdfs_upload_file client.conf filename.txt
出现group....txt -———————— > 成功

FastDFS配合Nginx使用

Nginx安装及其模块的添加

下面的内容发生了更改
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

Nginx相关的配置

目前本地的程序已经可以基本运行了,因为redis,fdfs就位,差celery异步。下一步就是在服务器运行程序。

uwsgi 配置

[uwsgi]
# 直接作为web服务器使用 python manage.py runserver ip:port
# http=127.0.0.1:8080
socket = 127.0.0.1:8080

# 项目的文件目录
chdir=/项目目录
# wsgi文件在你的项目目录的哪里   基于上面的目录
wsgi-file=daily_fresh/wsgi.py
processes=4
threads=2
master=True # 有主进程

# 保存主进程的进程号
pidfile=uwsgi.pid
# 作为守护进程,并保存日志
daemonize=uwsgi.log


# 虚拟环境的目录
virtuaenv=/虚拟环境的目录

uwsgi + Nginx(做)

location / {
    inlcude uwsgi_params;          #  参数也要包含
    uwsgi_pass 127.0.0.1:8080;      #  转交给uwsgi
}
location /static {
  alias /data/www/static/;   # 指定静态文件的目录
}

nginx还未完成

celery的配置

import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE','dailyfresh.settings')
#或者os.environ['DJANGO_SETTINGS_MODULE'] ='daily_fresh.settings')
django.setup()

理论上应该是没有问题,但是不能导入,就是时机不对,太早了,所以在使用到这个函数的时候在导入,写在里面就好了

class BaseAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        super().save_model(request, obj, form, change)
        from celery_tasks.tasks import generate_static_index_html

        generate_static_index_html.delay()

        cache.delete('index_page_data')

    def delete_model(self, request, obj):
        super().delete_model(request, obj)
        from celery_tasks.tasks import generate_static_index_html

        generate_static_index_html.delay()

        cache.delete('index_page_data')

uwsgi + Nginx(释)

  • 思路: 1. 用户访问一个地址,由nginx接受参数,并判断是静态请求还是动态请求这步判断就是nginx的路由匹配location /url/ { }
    1. 如果是静态请求,就是请求了一些图片,css,js等资源,我们实现把这些资源放在一个文件中,并设置nginx的路由匹配,将匹配结果导向我们的文件位置。
    1. 如果是动态请求,那么就转交给uwsgi,让uwsgi在调用application() 访问django系统,系统返回参数给uwsgi,再通过nginx返回到用户界面。
      nginx配置文件,里面的http{}中全是一些serve{}
      listen:监听的端口号,
      server_name:监听的ip地址
      location ‘url’{ }:路由,括号里面类似于django的urls。

静态请求

1 如果像直接返回静态文件,不提交到uwsgi服务器,那么里面直接写本机中的文件路径,新建一个存放静态文件的路径。/data/www/daily_fresh/static,然后在nginx.conf中指定当访问/static路径时,就去找/data/www/daily_fresh/static目录
location /static {
# 指定存放静态文件的目录
alias /data/www/daily_fresh/static
}

在setting的文件中指定STATIC_ROOT的值为刚才的路径/data/www/daily_fresh/static,
执行 python manage.py collectstatic收集静态文件。

权限不够的话, chmod 777 /data/daily_fresh/static/

1.2 当用户请求的静态文件不在此电脑上时可以,可以通过ip访问到另一nginx的上的静态文件
location = / {
指定存放静态文件nginx的ip地址,及端口,没写就是默认80
proxy_pass http://ip:port;
}

动态请求

  1. 如果是要提交给uwsgi服务器,同时还要提交传入的参数给uwsigi, 就需要uwsgi的端口号和地址。
    # 包含uwsgi的请求参数
    include uwsgi_params;
    # 转交给 uwsgi 的ip和端口
    uwsgi_pass 127.0.0.1:8080;

配置nginx的时候,小心分号,少写会报错。

项目总体


每一个部分都可以在不同的电脑上。

  • django项目跑在uwsgi服务器上,可以在项目中多创建几个uwsgi.ini,注意其中的socket端口不能相同,还有就是uwsgi.pid和log的名字也要变化
  • 静态页面的服务器和应用服务器时分离的,实现了前后端分离。
  • 在调度服务器中可以通过ip:port访问静态文件。
  • mysql,fstdfs,redis也可不在同一台电脑中,通过ip:port连接。
    其中fdfs的访问要通过nginx实现,让他监听网站的某个端口来实现上传和下载。

在tasks中的前面要加上django启动时的环境,但是启动时的环境导入这任务中的函数就会出错,报import异常,所以要把import放在里面,什么时候用,什么时候import。

出现的问题

TypeError: context must be a dict rather than RequestContext:
这个问题是django版本的问题,出现在生成静态首页的位置,我们需要得到html页面,并保存在本地,而不需要返回

    # 使用模板
    # 加载模板文件
    temp = loader.get_template('static_index.html')
    # 定义模板上下文
    context = RequestContext(request,context)
    # 模板渲染
    static_index_html = temp.render(context)
    # 生成首页对应的静态文件
    save_path = os.path.join(settings.BASE_DIR, 'static/index.html')
    with open(save_path,'w') as f:
        f.write(static_index_html)

问题的关键是context必须是一个字典

继续上面的nginx

但是始终不能访问,位置也换过,文件夹的权限也改过,这里猜想可能是因为这里的static并没有被访问,因为没有给项目中的static配置,所以访问不到。但是静态页面也应该出现个画呀,不知道是什么问题。
于是我采取了曲线救国的策略,又配置了一台nginx server

server 配置81端口
location / {
  root  /data/daily_fresh/static/; #我的项目路径
  index  index.html index.htm
}
location  /static {  # 右边没有/
  alias  /data/daily_fresh/static/; #我的项目路径
}

启动这台服务器,然后访问网站的81端口(在服务器中打开端口,重启防火墙,在阿里云客户端添加81端口),成功。
主nginx精确匹配 / 时,转交给这台nginx

nginx.conf

user root;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    server {
    listen      8888;
    server_name 47.100.179.209;
    location ~/group[0-9]/ {
        ngx_fastdfs_module;
    }    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
    }  

    server {
    listen       81;
    server_name 47.100.179.209;
    location / {
    #   autoindex on;
       root /data/daily_fresh/static/;
       index index.html index.htm;
    }
    location /static{
        alias /data/daily_fresh/static/;
    }
    }
#   upstream daily_fresh{
#   server 127.0.0.1:8080;
#   server 127.0.0.1:8081;  # 将下面的uwsgi_pass 中的127.0.0.1换成daily_fresh
#   }                         前提是有两个uwsgi.ini文件,启动两个uwsgi,nginx 负责发牌式的负载均衡
    server {
        listen      80;
        server_name 47.100.179.209;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        location / {
            include uwsgi_params;
        uwsgi_pass 127.0.0.1:8080;
       #uwsgi_pass daily_fresh;
        }
    
    location = /{
        proxy_pass http://47.100.179.209:81;
    }

    location /static{
        alias /data/www/static/;
    }
    
    }

出现的问题

图片类型没有发布,ImageFileField is not 发布

自己傻了

总结:

出现问题后程序的问题不大,前提是在windows端出现的错误改了之后(指改mysqlclient,django/db里面的源码)

  1. 仔细看看有没有操作失误,指在各种conf中有没有配置错误,拼写错误,拼写错误,拼写错误。。。
  2. 如果是静态文件,打开F12看看出现什么问题,路径错误就去模板html中再看看,settings中的几项配置STATICFILES_DIRS,STATIC_URL,STATIC_ROOT看看,多斜杠,少斜杠
  3. 打开DEBUG看看有什么错误,这个是最管用的,记得把ALLOW_HOSTS=[‘*’]
  4. linux和windows的不兼容问题,出问题的是什么插件,就去百度下有没有类似的错误,有没有相关的资料。
    5.再来一遍。
上一篇 下一篇

猜你喜欢

热点阅读