1 问题描述

部署完成后, 访问首页没有问题

nginx 配置展示文件夹下的图片_django


但访问登录页, 注册页等其它页面都出现了SyntaxError

nginx 配置展示文件夹下的图片_nginx 配置展示文件夹下的图片_02

2 探究原因

(1) nginx配置

在我的ubuntu服务器里的nginx配置如下

sudo vi /etc/nginx/conf.d/nginx.conf

# 设定负载均衡的服务器列表
upstream meiduo{
    server 192.168.250.130:8001;  # 本机的uwsgi服务器
}
# 虚拟主机的配置,一个server就代表一个虚拟主机
server {
    # 监听端口80
    listen       192.168.250.130:80;
    # 域名可以有多个, 用空格隔开
    server_name  www.meiduo.site;
    # 资源定位
    location =/{
        # 站点根目录,你网站文件存放的地方
        root /home/ws/Desktop/meiduo/meiduo_mall/meiduo_mall/static;
        index index.html;
    }
    location =/index.html{
        root /home/ws/Desktop/meiduo/meiduo_mall/meiduo_mall/static;
    }
    location /static{
        root /home/ws/Desktop/meiduo/meiduo_mall/meiduo_mall;
    }
    location /detail{
        root /home/ws/Desktop/meiduo/meiduo_mall/meiduo_mall/static;
    }
    location /{  # 访问其它路径的转发到upstream meiduo
        include uwsgi_params;
        uwsgi_pass meiduo;
    }
}
# 后台前端页面
server {
    # 监听端口8080
    listen       192.168.250.130:8080;
    # 域名可以有多个, 用空格隔开
    server_name  www.meiduo.site;
    # 资源定位
    location =/{
        # 站点根目录,你网站文件存放的地方
        root /home/ws/Desktop/meiduo_mall_admin;
        index index.html;
    }
}

分析: 服务器监听80端口, 把除了首页, /static, /detail之外的其它路径都转发给upstream meiduo, 由uWSGI服务器来处理, 那么不能访问其它页面应该是uWSGI服务器的问题

(2) uWSGI配置

meiduo/meiduo_mall/uwsgi.ini

[uwsgi]
#使用nginx连接时使用,Django程序所在服务器地址
socket=192.168.250.130:8001
#项目目录
chdir=/home/ws/Desktop/meiduo/meiduo_mall
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=meiduo_mall/wsgi.py
# 进程数
processes=4
# 线程数
threads=2
# uwsgi服务器的角色
master=True
# 存放进程编号的文件
pidfile=uwsgi.pid
# 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的
daemonize=uwsgi.log
# 指定依赖的虚拟环境
virtualenv=/home/ws/.pyvirenv/meiduo

感觉没什么问题, 于是查看同目录下的日志文件 uwsgi.log

ERROR log 224 Internal Server Error: /login/
Traceback (most recent call last):
File “./meiduo_mall/urls.py”, line 31, in
path(‘meiduo_admin/’, include(‘meiduo_admin.urls’)),
File “/home/ws/Desktop/meiduo/meiduo_mall/meiduo_mall/apps/meiduo_admin/urls.py”, line 5, in
from .views import statistical, users, specs, images, skus, orders,
File “/home/ws/Desktop/meiduo/meiduo_mall/meiduo_mall/apps/meiduo_admin/views/images.py”, line 6, in
from …serializers.images import ImagesSerializer, SKUSerializer
File “/home/ws/Desktop/meiduo/meiduo_mall/meiduo_mall/apps/meiduo_admin/serializers/images.py”, line 2, in
from fdfs_client.client import Fdfs_client
File “/home/ws/.pyvirenv/meiduo/lib/python3.8/site-packages/fdfs_client/client.py”, line 12, in
from fdfs_client.utils import *
File “/home/ws/.pyvirenv/meiduo/lib/python3.8/site-packages/fdfs_client/utils.py”, line 230
print get_file_ext_name(’/bc.tar.gz’)

相关的部分报错信息如上, 那么原因很可能是下面调用的这个地方

nginx 配置展示文件夹下的图片_django_03


这里的settings应该是指哪个文件呢?

在wsgi.py中指出了, settings模块是meiduo_mall/settings/dev.py

nginx 配置展示文件夹下的图片_python_04


而在settings/dev.py中, 定义的FDFS_CLIENT_PATH在

meiduo/meiduo_mall/meiduo_mall/utils/fastdfs/client.conf

nginx 配置展示文件夹下的图片_python_05


进到client.conf, 里面的有效配置如下, 没什么异常

connect_timeout=30
network_timeout=60
base_path=/home/ws/Desktop/meiduo/meiduo_mall/logs
tracker_server=192.168.250.130:22122
log_level=info
use_connection_pool = false
connection_pool_max_idle_time = 3600
load_fdfs_parameters_from_tracker=false
use_storage_id = false
storage_ids_filename = storage_ids.conf
http.tracker_server_port=80

(3) 问题出在哪呢?

综上, 两个都没问题, 但是在找问题的过程中我发现了一个新问题, 会不会是这个问题导致的呢?

之前在mac上开发时, 我有把这两个目录mark directory as Souces Root

nginx 配置展示文件夹下的图片_服务器_06


但是当把项目拷贝到服务端时, 这两个就不再是source root了

nginx 配置展示文件夹下的图片_nginx 配置展示文件夹下的图片_07


又发现在settings/dev.py已经把apps添加到导包路径了

nginx 配置展示文件夹下的图片_python_08


那么就还剩meiduo/meiduo_mall没添加到导包路径, 那么这个路径会被自动添加到sys.path吗?

由于之前一直是通过python mange.py sunserver, 而manage.py就在meiduo/meiduo_mall中, 所以这个目录是会被自动添加的

但是现在不一样, 现在是通过uWSGI服务器来运行Django应用框架的

uwsgi --ini uwsgi.ini

可以看到, 这条语句跟python没有半毛钱关系, 所以不会添加当前文件路径到sys.path(导包路径)

3 解决问题1(失败)

既然是meiduo/meiduo_mall没有添加到导包路径, 那解决起来也很简单
由于BASE_DIR = ‘/Users/ws/PycharmProjects/meiduo/meiduo_mall/meiduo_mall’
那么定位到meiduo/meiduo_mall/, 取父目录即可
在settings/dev.py中

import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
sys.path.insert(0, os.path.join(BASE_DIR, '..'))  # 加上这一句即可
print(sys.path)

然后重新运行uwsgi

nginx 配置展示文件夹下的图片_nginx_09


查看日志, 发现确实要这样操作, sys.path才有这两个导包路径

nginx 配置展示文件夹下的图片_服务器_10


但是!!! 题目的问题还是没能解决

4 解决问题2(失败)

再回来认真看看meiduo_mall/logs/meiduo.log日志文件吧,

what the fuck, 这里居然出现了python2的代码,

呃, 之前在python3.6上测试没什么问题嘛, 现在换为ubuntu自带的python3.8就不行了?那就再给ubuntu整一个python3.6的解释器试试

nginx 配置展示文件夹下的图片_python_11


换为python3.6后果然不报错了, 但是报内部服务器错误

nginx 配置展示文件夹下的图片_nginx 配置展示文件夹下的图片_12


看下uwsgi.log

nginx 配置展示文件夹下的图片_django_13


突然想起来uwsgi.ini里有个virtualenv路径没改, 改一下再重启uwsgi试试

nginx 配置展示文件夹下的图片_django_14


好吧, 还是回到了起点, 说明也不是py解释器版本的问题

nginx 配置展示文件夹下的图片_python_15


那之前为什么可以呢?

找到之前的笔记, 发现以前安装fdfs-client-py并不是通过pip install
而是安装的从Github上下载的支持py3的fdfs-client-py版本
pip install fdfs_client-py-master.zip
但是后来我们是通过pip install -r requirements, 所以不行

3 解决问题3(成功)

那看来问题还是出自fdfs-client-py, 网上有文章说这个模块只支持python2, python3要用py3fdfs

nginx 配置展示文件夹下的图片_python_16


然后代码跟fdfs-client-py的有一点点差异

from fdfs_client.client import Fdfs_client, get_tracker_conf

tracker_path = get_tracker_conf(settings.FDFS_CLIENT_PATH)  # 多一步这个
cli = Fdfs_client(tracker_path)

nginx 配置展示文件夹下的图片_django_17


再重启uwsgi试试, 终于成功了

nginx 配置展示文件夹下的图片_服务器_18