nginx版本:1.20.1
uwsgi版本:2.0.19.1
django版本:3.2.5
Django项目数据库使用sqlite3,django版本为3.2.5,linux环境自带的sqlite版本太低,启动时时提示 django.db.utils.NotSupportedError: deterministic=True requires SQLite 3.8.3 or higher
项目需要到部署公司预生产服务器,没有开放端口白名单,只能使用开发部署好的nginx做代理,出现静态文件和请求接口路径出错的问题
Python3.7及以上版本不支持1.0.2版本以下的openssl(服务器自带版本为1.0.1),导致请求https接口报 Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")
首次把写好的django项目丢到本地服务器测试运行,使用 python3 manage.py runserver 0.0.0.0:8088
命令时启动报错,django.db.utils.NotSupportedError: deterministic=True requires SQLite 3.8.3 or higher
,自带的sqlite3版本过低,django3不支持使用,使用 sqlite3 -version
查看sqlite3版本为3.6.20,天真的我以为升级下版本就好了,于是下载了3.27.2版本的sqlite3安装包,更新后重新配置,在python中也验证了版本没有问题:
再次运行时继续报错。
无果后只能通过安装 pysqlite3
和 pysqlite3-binary
库,再修改django配置解决,那就装吧。
pip3 install pysqlite3
pip3 install pysqlite3-binary
分别安装好两个库,接下来就是修改django中的导入配置:
# 根据自己python3安装的位置填写路径
vim /usr/local/python3/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py
# from sqlite3 import dbapi2 as Database (在文件内找到并注释掉这段)
from pysqlite3 import dbapi2 as Database # 修改为pysqlite3
至此,sqlite3版本过低 的问题解决。
在本地环境运行时没有任何问题,使用 python3 manage.py runserver 0.0.0.0:8088
命令启动后可以正常打开,在我上传到预生产环境、然后启动项目、打开浏览器访问准备大干一场时,发现前端页面请求不到静态资源了,前端页面写的非常简陋我就不放了,就是实现一个对接百度API识别发票接口,客户在前端上传包含发票图片的压缩包,上传完毕后可点击归档按钮,后台解压压缩包–>获取所有图片–>压缩后进行图片识别–>识别完成后根据返回的开票人姓名创建文件夹–>将该图片移动至新建文件夹内–>将图片名称修改为购买方–>处理完毕后打成一个压缩包返回前端下载,这么一个小需求。
因为不能直接开放端口白名单,开发老哥让我配置nginx做代理(我一个小测试,也没用过呐),首次配置无果,静态资源和请求的接口都是有问题的,后面看了看uwsgi+nginx的配置,在本地做测试:
下载nginx安装包 nginx下载地址
pip3 install uwsgi
在django项目根目录下新建一个uwsgi.ini文件,写入内容与下:
[uwsgi]
socket = :8099
chdir = /usr/junbao/web/django_web # django项目文件夹 目录下有manage.py文件
module = django_web.wsgi # 层级目录为 django_web/django_web/wsgi
master = true # 允许主进程存在
processes = 4 # 开启的线程数量
vacuum = true # 退出时自动清理 删除unix socket文件赫尔pid文件
注:uwsgi.ini文件放入项目文件夹内,与manege.py同级
2.1 安装nginx依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2.2 将下载好的nginx安装包上传至服务器
2.3 安装nginx,依次执行以下命令
tar -zxvf nginx-1.20.1.tar.gz
cd nginx-1.20.1
./configure --prefix=/usr/local/nginx
make && make install
2.4 修改nginx配置文件
打开nginx.conf配置文件,修改或配置
vim /usr/local/nginx/conf/nginx.conf
如图所示,主要修改的部分就是上面圈起来两个红框,第一个红框是nginx监听的端口,默认为80,server_name为服务器ip地址,也可以是域名 ,
listen: 指定端口;
server_name: IP / 域名;
client_max_body_size: 上传文件的大小限制;
location /dispose:访问路径,默认为/,实际配置中可能存在多个项目,需要指定路径
include uwsgi_params:固定用法
uwsgi_pass 127.0.0.1:8099:127.0.0.1是固定用法,8099为启动端口号,与uwsgi.ini文件中配置的端口号要保持一致
location /dispose_static: 静态文件请求路径,默认为/static,实际配置中可能存在多个项目,需要指定路径
alias:跟的是django项目的静态文件目录,路径不要配置成django项目-app下的static目录,在这你就先写成 服务器存放路径/django根目录/static
到这nginx的配置就算完成了。
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['*', ]
# 新增如下配置 python manage.py collectstatic 命令生成静态文件的地址
STATIC_ROOT = '/usr/junbao/web/django_web/static/' # 这个地方的地址就是nginx中配置alias时的地址
urlpatterns = [
url(r'^dispose/delete_file/$', delete_file), # 删除上传的压缩包
]
以 '^dispose/delete_file/$'
为例,因为在之前的nginx配置中,请求路径我修改为 location /dispose
,代表请求dispose这个项目下的download接口,请求路径为 http://域名.cn/dispose/delete_file/
,html请求地址为 /dispose/delete_file/
,如果部署时没有其他项目影响,可直接使用location /
,请求路径为 http://域名.cn/delete_file
,html请求地址为 /delete_file/
。
前置条件:所有配置按如上处理,django项目压缩包已经上传至服务器并解压
5.1 生成django项目静态文件
# 进入django项目根目录
cd /usr/junbao/web/django_web
# 创建static目录
mkdir static
# 执行生成静态文件命令 会把静态文件全部导入到 /usr/junbao/web/django_web/static/ 文件夹内
python3 manage.py collectstatic
5.2 启动nginx (此前nginx配置文件已经修改好了)
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
5.3 启动uwsgi
# 确保自己处于django项目根目录中 执行以下命令
uwsgi --ini uwsgi.ini
至此,静态文件和请求接口路径出错 的问题已解决。
因为项目中需要通过 requests
请求https接口,在执行该请求时报错了,报错内容重点为 Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")
,度娘以后发现是服务器自带的openssl版本过低,为1.0.1版本,要求是1.0.2及以上版本才可以正常调用。
好么,在这遇到的坑就比较简单了,百度以后有两种方法解决:
升级openssl版本
安装libressl替换掉openssl
很不幸,我先选择的是第二种,然后在我重装了几次python环境后放弃了,明明已经替换掉iopenssl,指向也修改了,配置文件也改了,重新安装python3.9的时候也修改了里边的配置,但就是失败了,所以后面选择使用第一种。
访问openssl官网查看新版本 openssl官网
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
2.1 下载完执行以下几个命令
tar -zxvf openssl-1.1.1k.tar.gzcd openssl-1.1.1k
./config --prefix=/usr/local/openssl./config -t
make && make install
cd /usr/local
ldd /usr/local/openssl/bin/openssl
openssl version -a # 查看openssl版本信息
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v
rm /usr/bin/openssl # 删除自带的软连接
对,你没看错,如果你之前已经安装python3,那很不幸,你得重新安装一下,为什么要这样,我只能说我也很无奈,因为升级openssl以后,已经安装好的python3环境在调https请求时还是会报错,如果你没有部署过python3环境,那就跟着我重头来一遍吧。
# 安装python环境可能使用到的依赖
yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel zlib-devel
# 下载python3源码包
wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar
# 解压缩
tar -xvf Python-3.9.0.tar
# 进入python文件目录
cd Python-3.9.0
# 注意指定的openssl路径是否正确
./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl
make && make install
等待安装完毕,剩下的就是配置软连接和安装django项目运行所需的依赖库了
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
# 测试
python3 --version
over,配置完成后记得重新 pip install uwsgi
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
然后执行 uwsgi --ini uwsgi.ini
运行django项目~