centos7+python3.6+django+uwsgi+nginx,生产环境下的django利用nginx实现访问

整个流程参考了这篇文章
工作原理参考
python3.7下安装uwsgi后报错参考
这篇文章的大前提:django已经配置好,可以用runserver运行,但是当把setings.py中的debug改为false后,访问页面就会出现500错误,后终于可以用–insecure解决,完整写法如下;

python manage.py runserver 0.0.0.0:9595 --insecure

环境和版本以及安装:

centos7-64bit

这里用的是百度云的BCC服务器,活动买的挺便宜,主要是可以免费快照(2019年4月22日)

python3.6(这里我刚开始用的3.7,但是uwsgi安装好之后一直报错,后来才发现是版本问题,后面细说)

【2022年3月30日更新】
版本问题导致的文件not found,可使用3.7版本,解决方案见目录【2022年3月29日更新:】

用的anaconda,原本安装的最新版本,后全部组件安装好之后uwsgi一直提示找不到文件,然后多亏了这篇文章,知道需要使用python3.6,于是用下面的命令:

conda install python=3.6    #指定安装python版本

然后一路yes就可以了,完事之后,可能django和uwsgi得重新安装一下

django2.2

我是直接pip 安装的

pip install django

uwsgi2.0.18

也是直接pip安装

pip install uwsgi

如果出错的话,说明dev没安装直接用下面的命令,把可能用上的都安装就ok

yum -y groupinstall "Development tools"
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

2022年11月19日更新
参考链接1
参考链接2

安装后运行uwsgi --verssion 报错1:

uwsgi: error while loading shared libraries: libicui18n.so.58: cannot open shared object file: No such file or directory

解决方案:

1、查看uwsgi位置

which uwsgi
# /soft/anaconda3/envs/mysite/bin/uwsgi

2、LDD查看缺少的包

ldd /soft/anaconda3/envs/mysite/bin/uwsgi
...
#    libicui18n.so.58 => not found
#    libicuuc.so.58 => not found
#    libicudata.so.58 => not found
...

3、将缺失的三个包软连接到lib64下(64位机器)

ln -s /soft/anaconda3/lib/libicui18n.so.58 /lib64/libicui18n.so.58
ln -s /soft/anaconda3/lib/libicuuc.so.58 /lib64/libicuuc.so.58
ln -s /soft/anaconda3/lib/libicudata.so.58 /lib64/libicudata.so.58

再次ldd测试即无缺失的包了

ldd /soft/anaconda3/envs/mysite/bin/uwsgi

uwsgi --version运行时报错2

uwsgi: /lib64/./libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /lib64/libicui18n.so.58)
uwsgi: /lib64/./libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /lib64/libicui18n.so.58)
uwsgi: /lib64/./libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /lib64/libicuuc.so.58)
uwsgi: /lib64/./libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /lib64/libicuuc.so.58)

解决方案:
1、使用string命令查看,缺失报错的3.8和3.9

strings /usr/lib64/libstdc++.so.6|grep CXXABI

2、anaconda安装后自带有so.6的文件,查找可用的so.6

find /soft/anaconda/envs/mysite/lib -name libstdc++.so.6*

3、使用string命令查看找到的文件是否包含3.8和3.9
4、将包含的文件,及软链同步复制到/lib64下;
在这里插入图片描述

cd /soft/anaconda/envs/mysite/lib 
ll libstdc++*

cp ./libstdc++.so /lib64/
cp ./libstdc++.so.6 /lib64/
cp ./libstdc++.so.6.0.26 /lib64/

nginx1.14.2

这里感谢这篇文章,我用了第一种方法,
直接通过 yum install nginx 肯定是不行的,因为yum没有nginx,所以首先把 nginx 的源加入 yum 中。

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum info nginx
yum install nginx

这里安装好之后,由于我服务器已经安装了apache,占用了80端口,这里我就把nginx的端口修改成8088

vim /etc/nginx/conf.d/default.conf

    charset utf-8;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8997;
        uwsgi_param UWSGI_SCRIPT project.wsgi;
        uwsgi_param UWSGI_CHDIR /data/django/project;
        #root   /usr/share/nginx/html;
        #index  index.html index.htm;
    }
    location /static/ {
        alias /data/django/project/static/; #静态文件目录
    }

顺便我在这里把uwsgi的相关设置也同时写上了
我的uwsgi用了8997端口
我的django项目名称就叫project (起名比较随意的)
wsgi是我django项目project下的wsgi
我的django项目放在/data/django/下
在这里插入图片描述

测试环境

django

以上内容的前提是django项目已经可以用runserver跑通,django不会出现错误,

#进入到项目目录后运行以下命令:
python manage.py runserver 0.0.0.0:9595

django && uwsgi

在项目根目录创建xml文件
注意里面的ip端口要写nginx配置文件中编辑的ip和端口即127.0.0.1:8997

vim /data/django/project/project.xml

<uwsgi>
    <socket>127.0.0.1:8997</socket><!-- 内部端口,自定义 -->
    <chdir>/data/django/project/</chdir><!-- 项目路径 -->
    <module>project.wsgi</module>
    <processes>4</processes> <!-- 进程数 -->
    <daemonize>uwsgi.log</daemonize><!-- 日志文件 -->
</uwsgi>

uwsgi

用以下命令和查看版本号,能看到版本号说明安装成功

uwsgi --version
#2.0.18

如果出现错误,can not load xxx ,no suchfile xxx这种错误,请检查python版本是否为3.6,并检查3.6的python-dev是否正确,最好的办法就是按照上面的方法,把所有可能的以来都安装起来

【2022年3月29日更新:】

python3.7下anaconda创建的虚拟环境pip安装uwsgi后报错如下:

uwsgi: error while loading shared libraries: libicui18n.so.58: cannot open shared object file

解决方案:
1、查看uwsgi安装位置,并查看缺少的包

which uwsgi

ldd /soft/anaconda3/envs/mysite/bin/uwsgi

2、将三个找不到的包进行软连接到lib64下
在这里插入图片描述

ln -s /soft/anaconda3/lib/libicui18n.so.58 /lib64/libicui18n.so.58
ln -s /soft/anaconda3/lib/libicuuc.so.58 /lib64/libicuuc.so.58
ln -s /soft/anaconda3/lib/libicudata.so.58 /lib64//libicudata.so.58

3、查看/lib64下libstdc++.so.6的指向是否与anaconda3/lib下的libstdc++.so.6指向是否一致,若不一致将anaconda3/lib下的libstdc++.so.6指向的东西复制到/lib64下,重新为libstdc++.so.6建立快捷方式
在这里插入图片描述
复制libstdc++.so.6并覆盖

cp /soft/anaconda3/lib/libstdc++.so.6 /lib64/

4、验证

uwsgi --version

# 2.0.20

【2019年4月30日更新:】
今天修改python代码后打算重启以下uwsgi,按照之前的方法,kill掉了全部uwsgi进程,再启动又报错了,跟以前一样的错误,然而找不到原因之后就恢复快照到上次的正常状态,但是服务得重启开启,但是恢复之后uwsgi依然报错,正在解决…
查了一下日志,24号部署完成的系统,截止到28号凌晨都运行正常,28号操作了jupyternotebook,更新了一些包导致版本不兼容了,具体如下:
在这里插入图片描述
还是回滚快照到28号,重新安装jupyter吧。简单粗暴的方法

yum -y groupinstall "Development tools"
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

网上查到django使用这个的时候,修改django项目后无法自动刷新,见这篇文章
解决方法就是kill掉所有的uwsgi进程后重启,
我是直接用了启动命令,在django项目下

uwsgi -x project.xml

nginx

用以下命令测试是否成功安装,出现seccess说明成功

[root@instance-xxxx ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

生产环境部署后admin后台样式丢失

uwsgi生产环境部署后,admin后台样式丢失,把django下列目录中的static复制到static下即可
C:\appdata\anaconda3\envs\mysite\Lib\site-packages\django\contrib\admin\static

总结

1、保证django运行正常
2、保证uwsgi安装正常
3、保证nginx配置正常(配置完成后可在浏览器输入IP:端口访问可看到欢迎页面)
以上为单项都运行正常
4、在django项目根目录下创建项目名.xml,并配置uwsgi的IP端口等
5、配置nginx的配置管理,增加uwsgi的ip和端口等,以及静态页面的位置
6、在项目目录下运行uwsgi -x project.xml,使uwsgi运行起来,可查看同目录下的uwsgi.log日志
7、查看nginx状态systemctl status nginx,并启动nginxsystemctl start nginx
8、若已启动,则重新加载nginx -s reload

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值