linux下nginx+uwsgi+django项目部署踩坑记录


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.")


CentOS版本号

注:建议你先倒着看最后一个问题,不然你得重头再来,有坑。


问题一 sqlite3版本过低:

​ 首次把写好的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中也验证了版本没有问题:

linux下nginx+uwsgi+django项目部署踩坑记录_第1张图片

再次运行时继续报错

无果后只能通过安装 pysqlite3pysqlite3-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版本过低 的问题解决。


问题二 nginx做代理转发:

​ 在本地环境运行时没有任何问题,使用 python3 manage.py runserver 0.0.0.0:8088 命令启动后可以正常打开,在我上传到预生产环境、然后启动项目、打开浏览器访问准备大干一场时,发现前端页面请求不到静态资源了,前端页面写的非常简陋我就不放了,就是实现一个对接百度API识别发票接口,客户在前端上传包含发票图片的压缩包,上传完毕后可点击归档按钮,后台解压压缩包–>获取所有图片–>压缩后进行图片识别–>识别完成后根据返回的开票人姓名创建文件夹–>将该图片移动至新建文件夹内–>将图片名称修改为购买方–>处理完毕后打成一个压缩包返回前端下载,这么一个小需求。

​ 因为不能直接开放端口白名单,开发老哥让我配置nginx做代理(我一个小测试,也没用过呐),首次配置无果,静态资源和请求的接口都是有问题的,后面看了看uwsgi+nginx的配置,在本地做测试:

  • 下载nginx安装包 nginx下载地址

  • pip3 install uwsgi
    

1.配置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.安装nginx

​ 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

linux下nginx+uwsgi+django项目部署踩坑记录_第2张图片

如图所示,主要修改的部分就是上面圈起来两个红框,第一个红框是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的配置就算完成了。


3. 修改django项目配置文件 settings.py

# 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时的地址

4. 注意查看django的路由 urls.py 以及html文件中请求的接口地址

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/

删除函数



5. 配置uwsgi+nginx+django

​ 前置条件:所有配置按如上处理,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

至此,静态文件请求接口路径出错 的问题已解决。


问题三 openssl版本过低:

​ 因为项目中需要通过 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的时候也修改了里边的配置,但就是失败了,所以后面选择使用第一种。


1. 下载openssl安装包

​ 访问openssl官网查看新版本 openssl官网


2. 通过命令行下载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

3. 设置openssl的安装路径并安装

./config --prefix=/usr/local/openssl./config -t

make && make install

4. 配置openssl

cd /usr/local

ldd /usr/local/openssl/bin/openssl

openssl version -a	# 查看openssl版本信息

linux下nginx+uwsgi+django项目部署踩坑记录_第3张图片


5. 备份服务器自带的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		# 删除自带的软连接 

6. 重新编译安装python3

对,你没看错,如果你之前已经安装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项目~

你可能感兴趣的:(Django,django)