Django+uwsgi+nginx服务器部署后无法访问除首页外的其它页面

1 问题描述

部署完成后, 访问首页没有问题
在这里插入图片描述
但访问登录页, 注册页等其它页面都出现了SyntaxError
在这里插入图片描述

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’)

相关的部分报错信息如上, 那么原因很可能是下面调用的这个地方
在这里插入图片描述
这里的settings应该是指哪个文件呢?
在wsgi.py中指出了, settings模块是meiduo_mall/settings/dev.py
在这里插入图片描述
而在settings/dev.py中, 定义的FDFS_CLIENT_PATH在
meiduo/meiduo_mall/meiduo_mall/utils/fastdfs/client.conf
在这里插入图片描述
进到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
在这里插入图片描述
但是当把项目拷贝到服务端时, 这两个就不再是source root了
在这里插入图片描述
又发现在settings/dev.py已经把apps添加到导包路径了
在这里插入图片描述
那么就还剩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
在这里插入图片描述
查看日志, 发现确实要这样操作, sys.path才有这两个导包路径
在这里插入图片描述
但是!!! 题目的问题还是没能解决

4 解决问题2(失败)

再回来认真看看meiduo_mall/logs/meiduo.log日志文件吧,
what the fuck, 这里居然出现了python2的代码,
呃, 之前在python3.6上测试没什么问题嘛, 现在换为ubuntu自带的python3.8就不行了?那就再给ubuntu整一个python3.6的解释器试试
在这里插入图片描述
换为python3.6后果然不报错了, 但是报内部服务器错误
在这里插入图片描述
看下uwsgi.log
在这里插入图片描述
突然想起来uwsgi.ini里有个virtualenv路径没改, 改一下再重启uwsgi试试
在这里插入图片描述
好吧, 还是回到了起点, 说明也不是py解释器版本的问题
在这里插入图片描述
那之前为什么可以呢?

找到之前的笔记, 发现以前安装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
在这里插入图片描述
然后代码跟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)

在这里插入图片描述
再重启uwsgi试试, 终于成功了
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值