django+nginx+uwsgi+django
本地开发一个新闻站的数据分析平台,花三天时间终于成功部署在linux平台上。
几年前,实施过linux的web服务器,对linux的操作只了解一些皮毛,这次部署也是按部就班、战战兢兢,参考了许多网友大牛的技术资料,也踩过了好多坑,现在整理一下。
基础条件:centos7.8
1.系统更新,安装基础环境
yum update -y yum -y groupinstall "Development tools" yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
2.安装python3.6 (和开发环境保持一致)
cd /usr/local wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
如报错可能还需要
yum install gcc
./configure --prefix=/usr/local/python3 ./configure --enable-optimizations make make install
3.建立虚拟目录和应用目录
mkdir -p /data/env
mkdir -p /data/wwwroot
4.激活虚拟环境
pip3 install virtualenv
virtualenv --python=/usr/local/bin/python3 itda2
cn /data/env/itda2/bin/ source activate
5.虚拟环境中安装django和uwsgi
pip3 install django (安装了最新版,3.0.8) pip3 install uwsgi 留意:uwsgi要安装两次,先在系统里安装一次,然后进入对应的虚拟环境安装一次。
6.建立django的测试环境会出现
raise ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' %Database.sqlite_version)
解决办法:https://www.cnblogs.com/hszstudypy/p/11512244.html
cd /usr/local
wget https://www.sqlite.org/2020/sqlite-autoconf-3320300.tar.gz tar zxvf sqlite-autoconf-3250300.tar.gz
cd sqlite-autoconf-3250300 sudo ./configure sudo make && make install
更改全局的sqlite版本并验证
## 查看有哪几个 sqlite3 find /usr/ -name sqlite3 ## 查看旧版本Centos7自带的sqlite3版本 /usr/bin/sqlite3 -version 3.7.17 2013-05-20 00:56:22 ## 最新安装的sqlite3版本 /usr/local/bin/sqlite3 -version 3.27.2 2019-02-25 16:06:06 # 备份旧的sqlite3 mv /usr/bin/sqlite3 /usr/bin/sqlite3_old # 软链接将新的sqlite3设置到/usr/bin目录下 ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3 # 查看当前全局sqlite3的版本 sqlite3 --version 3.27.2 2019-02-25 16:06:06 #将路径传递给共享库 # 设置开机自启动执行,可以将下面的export语句写入 ~/.bashrc 文件中,如果如果你想立即生效,可以执行source ~/.bashrc 将在每次启动终端时执行 export LD_LIBRARY_PATH="/usr/local/lib" # 查看python环境中sqlite3 是否已经更新 [root@localhost]# python3 >>> import sqlite3 >>> sqlite3.sqlite_version '3.27.2'
或者在django中的settings.py是注释掉sqlite部分也可以正常启动,如果你不计划用sqlite的话。
7.安装nginx
cd /usr/local wget http://nginx.org/download/nginx-1.19.0.tar.gz tar -zxvf nginx-1.13.7.tar.gz mv nginx-1.13.7 nginx cd nginx ./configure make make install
在/usr/local/nginx/conf/中先备份一下nginx.conf文件,以防意外。
cp nginx.conf nginx.conf.bak
然后打开nginx.conf,把原来的内容删除,直接加入以下内容,完全参考网友建议,但有一个坑
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; server { listen 80; server_name www.django.cn; charset utf-8; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8997; uwsgi_param UWSGI_SCRIPT mysite.wsgi; uwsgi_param UWSGI_CHDIR /data/wwwroot/mysite; } location /static/ { alias /data/wwwroot/mysite/static/; #应该是完整路径,data前应该用/,我原先参考的资料中没有 } } }
其实原来的conf也可以使用,只需要修改几个关键地方即可,其实的基本都被注释了
进入/usr/local/nginx/sbin/目录,启动nginx
./nginx
8.迁移数据平台和爬虫程序
在本地将依赖生成文本
pip freeze > requirements.txt
本地分别打包平台和程序的rar,并上传到/data/wwwroot
系统中安装rarlinux-x64-5.3.0
在/data/wwwroot中
rar x itda.rar
rar x syxw.rar
9.修改配置
程序中修改原来win方式的路径
在/data/wwwroot/itda2/itda2/setting.py中增加,方便以后nginx对静态资源的支持
STATIC_ROOT = '/data/wwwroot/itda2/static/'
在/data/wwwroot/itda2/itda2.xml中创建
<uwsgi> <socket>127.0.0.1:8997</socket><!-- 内部端口,自定义 --> <chdir>/data/wwwroot/itda2/</chdir><!-- 项目路径 --> <module>itda2.wsgi</module> <processes>4</processes> <!-- 进程数 --> <daemonize>uwsgi.log</daemonize><!-- 日志文件 --> <home>/data/env/itda2</home> #这是另外一个坑,使得uwsgi -x itda2.xml </uwsgi>
其中的home项是后面加的,网上大多数是用ini的方式来支持,我想xml方式应该也是可以,实践证明,两个是同理的,只是书写的调用的方式不同,都是用来定义应用的虚拟环境路径
10.测试程序
利用python3 manage.py runserver 0.0.0.0:81
报错不能装postsql的库psycopg2
只能二进制装
https://pypi.org/project/psycopg2-binary/#files
下载2.8.5 寻找对应的python版本号
psycopg2_binary-2.8.5-cp36-cp36m-manylinux1_x86_64.whl (2.9 MB)
在虚拟环境中安装
pip install psycopg2_binary-2.8.2-cp37-cp37m-manylinux1_x86_64.whl
问题解决
11.安装mongodb(爬虫数据保存)
参考:https://www.jianshu.com/p/994bc7b19b26
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-4.2.8.tgz
下载了最新版
$ tar zxvf mongodb-linux-x86_64-rhel62-4.2.8.tar.gz $ mv mongodb-linux-x86_64-rhel62-4.2.8 mongodb
vi /etc/profile
在 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL 一行的上面添加如下内容:
#Set Mongodb
export PATH=/usr/mongodb/bin:$PATH
保存后,使配置生效
$ cd ~
$ source /etc/profile
$ cd /usr/local/mongodb
$ touch mongodb.conf
$ mkdir db
$ mkdir log
$ cd log
$ touch mongodb.log
配置mongodb
vim /usr/mongodb/mongodb.conf
添加以下内容
port=27017 #端口 dbpath= /usr/mongodb/db #数据库存文件存放目录 logpath= /usr/mongodb/log/mongodb.log #日志文件存放路径 logappend=true #使用追加的方式写日志 fork=true #以守护进程的方式运行,创建服务器进程 maxConns=100 #最大同时连接数 noauth=true #不启用验证 journal=true #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。 #即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复。 storageEngine=wiredTiger #存储引擎有mmapv1、wiretiger、mongorocks bind_ip = 0.0.0.0 #这样就可外部访问了,例如从win10中去连虚拟机中的MongoDB
设置权限
$ cd /usr/local/mongodb $ chmod 777 db $ chmod 777 log
启动
$ cd ~
$ mongod -f /usr/local/mongodb/mongodb.conf
本地使用MongoDB Compass,远程连接并创建新数据库,一切顺利,舒服
在远程使用过程 中,可以临时将系统防火墙关闭,减少干扰,后期再调整,风险自己把握
12.安装redis(分布式爬虫使用)
You need tcl 8.5 or newer in order to run the Redis test
安装redis6.0.5 版本太新的了,报错,gcc版本低不匹配
https://blog.csdn.net/zhangchaoyang/article/details/104456978
查看gcc版本,果然低
gcc -v
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/tcl-8.5.13-8.el7.x86_64.rpm rpm -ivh tcl-8.5.13-8.el7.x86_64.rpm
make && make test 过程挺慢的
13.django的样式问题
1、在settings.py尾部:
STATIC_ROOT = '/data/wwwroot/itda2/static' #设置一个目录,把后台CSS样式放到这个目录里
2、收集CSS样式,在终端输入:
python manage.py collectstatic
运行这个命令之后,就会自动把后台CSS样式收集到/static/目录下。
3、重启服务,成功。
14.启动
uwsgi
cd /data/wwwroot/itda2
uwsgi -x itda2.xml
nginx
cd /usr/local/nginx/sbin/
./nginx
redis
cd /usr/local/redis/bin
./redis-server redis.conf
mongodb
cd /usr/local/mongodb
./mongod -f /usr/local/mongodb/mongodb.conf
大致的安装过程记录如上
在实际操作中,环境都安装好之后,需要反复启动程序,观察uwsgi.log,nginx/error.log,日志文件往往可以给你很好的提示信息。
pip install psycopg2_binary-2.8.2-cp37-cp37m-manylinux1_x86_64.whl