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

原文地址:https://www.cnblogs.com/spidernyp/p/13357425.html