Python项目(Django框架)天天生鲜在CentOS7.9搭建运行

项目地址:fresh-everyday

CentOS安装python3

为方便管理,在CentOS桌面创建一个文件夹,将软件包下载到这里,右键--在终端打开

安装python3.9.7 :

 wget https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz

(命令前的sudo如果是root用户可以去掉

解压 : 

 tar -zxvf Python-3.9.7.tgz

进入解压后的目录 :

cd Python-3.9.7

编译

./configure --prefix=/usr/local/python39

  其中--prefix是Python的安装目录,指定把python安装到那里,同时也安装了setuptools和pip工具

 

 

安装 

make && make install

 如果提示权限不够的话切换到root用户,但是保留当前用户工作目录,再次执行命令即可

 如果编译安装失败:一般情况都是因为缺少编译环境,通常python的编译环境需要zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make。执行下命令,再次安装即可

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make

安装失败 

安装成功

 进入安装目录

 cd /usr/local/python39

创建软连接

ln -s /usr/local/python39/bin/python3.9 /usr/bin/python3
ln -s /usr/local/python39/bin/pip3 /usr/bin/pip3

验证是否配置成功:

python3 --version

 出现版本号即成功

创建使用Python虚拟环境

安装虚拟环境

pip3 install virtualenv

如果出现以上信息,说明要安装OpenSSL

yum install -y openssl openssl-devel
yum clean all

再次执行命令pip3 install virtualenv,发现还是同样的问题。

查阅资料发现,在./configure过程中,如果没有加上–with-ssl参数时,默认安装的软件涉及到ssl的功能不可用,刚好pip3过程需要ssl模块,而由于没有指定,所以该功能不可用。

解决办法是重新进入python3.9目录进行编译安装,然后再执行命令pip3 install virtualenv,用一下过程来实现编译安装:

cd Python-3.9.7
./configure --with-ssl --prefix=/usr/local/python39

make && make install

安装成功

安装虚拟环境扩展包

pip3 install virtualenvwrapper

创建一个文件夹,用于存放所有的虚拟环境 (这里存放在/home/Ruyanjun/桌面/天天生鲜/virtualenvs)

mkdir -p virtualenvs

 编辑~/.bashrc文件

vim ~/.bashrc

添加下面两行

export WORKON_HOME=/home/python/virtualenvs
source /usr/local/python39/bin/virtualenvwrapper.sh

 使用

source ~/.bashrc

命令使其生效

提示/usr/bin/python: No module named virtualenvwrapper,是因为安装了2.x和3.x两个版本的python,在安装时使用的是sudo pip3 install virtualenvwrapper
在我运行的时候默认使用的是python2.x,但在python2.x中不存在对应的模块,只需要在bashrc文件里面加入如下命令即可,再次执行上述命令
 

VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3

出现以下即执行成功

 

 创建虚拟环境

mkvirtualenv -p python3 fresh_everyday

fresh_everyday:虚拟环境名 -p:指定python版本

报错:

原因分析:virtualenv依赖包被安装在默认Python目录下
解决方法:做一个软连接

ln -s /usr/local/python39/bin/virtualenv /usr/bin/virtualenv

重新创建即可 

 进入虚拟环境工作

workon fresh_everyday

退出虚拟环境(先不用退出, 接下来的操作都在虚拟环境中进行

deactivate

安装项目需要的依赖包

安装Django 

pip install django

安装pymysql

pip install pymysql

安装django-tinymce 富文本编辑器

pip install django-tinymce

安装itsdangerous 加密模块

pip install itsdangerous

安装celery 异步任务

pip install -U Celery

安装redis

pip install redis

安装django-redis

pip install django-redis

安装alipay-sdk-python

pip install alipay-sdk-python

安装django-haystack和whoosh 全文检索

pip install django-haystack
pip install whoosh

安装django-haystack失败,提示ModuleNotFoundError: No module named ‘_ctypes’,

解决方法:

1退出虚拟环境安装外部函数库(libffi)

yum install libffi-devel -y

然后回到python的安装过程,重新安装python即可

我的步骤:

cd ..
yum install libffi-devel -y
cd Python-3.9.7
make && make install
workon fresh_everyday
pip install django-haystack

 Successfully即是成功

安装py3Fdfs 分布式文件系统

pip install py3Fdfs==2.1.0

 安装jieba 结巴分词

pip install jieba

安装Pillow ImageField依赖

python -m pip install Pillow

(安装的时候可能会超时,多试几次或者换源)

mysql的安装

安装mysql 5.7

wget 命令需先安装

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

安装MySQL源

yum -y localinstall mysql57-community-release-el7-11.noarch.rpm

安装mysql

yum -y install mysql-community-server

安装过程可能存在问题:

 

方法:

rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

 再执行安装命令即可

启动mysql 服务

systemctl start mysqld

登录mysql修改密码

此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:

grep "password" /var/log/mysqld.log

找到root@localhost:后面的密码,copy下来

登录mysql

mysql -u root -p

粘贴复制的密码

设置密码策略

SET GLOBAL validate_password_policy=LOW;

修改密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '这里输入你的密码';

设置远程访问

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '输入你的密码' WITH GRANT OPTION;

刷新权限 

FLUSH PRIVILEGES; 

项目部署

在/root目录中创建文件夹fresh-everyday,将https://github.com/Ruyanjun/fresh-everyday/tree/main/app中的所有文件放入该fresh-everyday文件中

可以现将项目克隆到本地,再用Xftp软件将这些文件传到CentOS中

找到安装目录下的haystack目录

pip show django-haystack

 进入/home/python/virtualenvs/fresh_everyday/lib/python3.9/site-packages/haystack/backends

 在该目录下创建ChineseAnalyzer.py文件

touch ChineseAnalyzer.py

 然后vi编辑,完成之后wq!保存

文件内容如下:

import jieba 
from whoosh.analysis import Tokenizer, Token

class ChineseTokenizer(Tokenizer):
    def __call__(self, value, positions=False, chars=False,
                keeporiginal=False, removestops=True,
                start_pos=0, start_char=0, mode='', **kwargs):
        t = Token(positions, chars, removestops=removestops, mode=mode, **kwargs)
        seglist = jieba.cut(value, cut_all=True)
        for w in seglist:
            t.original = t.text = w
            t.boost = 1.0
            if positions:
                t.pos = start_pos + value.find(w)
            if chars:
                t.startchar = start_char + value.find(w)
                t.endchar = start_char + value.find(w) + len(w)
            yield t

def ChineseAnalyzer():
    return ChineseTokenizer()

复制 whoosh_backend.py 文件,改为 whoosh_cn_backend.py 

 cp  whoosh_backend.py whoosh_cn_backend.py

打开复制出来的新文件,引入中文分析类,内部采用jieba分词 

from .ChineseAnalyzer import ChineseAnalyzer

打开复制出来的新文件,查找 analyzer=field_class.analyzer or StemmingAnalyzer() 改为 analyzer=field_class.analyzer or ChineseAnalyzer()

 创建数据库

进入数据库执行

CREATE DATABASE fresh_everyday DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_bin

修改项目文件中数据库链接的指向 settings.py 对应自己的主机、端口、用户名、密码

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'fresh_everyday',
        'HOST':'',
        'PORT':'',
        'USER':'',
        'PASSWORD':'',
        'OPTIONS': {
            "init_command": "SET foreign_key_checks = 0;" # 关闭外键约束
        }
    }
}

删除项目目录各个应用程序中migrations目录xxxx_initial.py文件,比如 /root/fresh-everyday/goods/migrations/0001_initial.py

删除之后进入/root/fresh-everyday执行迁移

python manage.py makemigrations
python manage.py migrate

 导入数据:将https://github.com/lang1427/py_fresh-everyday/dailyfresh.sql文件传递到服务器上/root/fresh-everyday目录中,连接到数据库后,选择fresh_everyday数据库(use fresh_everyday),通过source dailyfresh.sql;命令导入数据

配置自己的邮箱规则 settings.py

    # 邮箱配置
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = 'smtp.qq.com'
    EMAIL_PORT = 587
    EMAIL_HOST_USER = '' # 发送者邮箱
    EMAIL_HOST_PASSWORD = '' # 授权码

可以去网易邮箱设置SMTP服务或者其他邮箱

端口号可以百度,网易的为25

 uwsgi + nginx 搭建服务

  uwsgi + nginx搭建反向代理原理可以参考:Nginx反向代理

nginx的安装可参考:安装Nginx

uwsgi安装(本人安装在/root目录下)

pip3 install uwsgi

uwsgi的配置

  • 项目部署时,需要设置 settings.py 文件夹下的DEBUG=False,ALLOWED_HOSTS=['*']

 uwsgi.ini 配置文件(在/root/fresh-everyday目录下)

注意(#此处根据你的实际情况修改)

[uwsgi]
# 指定IP端口,ip为内网ip,如果是云服务器,是云服务器内网ip
# http可以直接访问,socket是让Nginx指定的
#此处根据你的实际情况修改.
#单独用uwsgi的话把socket改成http
socket = 127.0.0.1:8001
# 项目目录,和manage.py同级的目录
#此处根据你的实际情况修改
chdir = /root/fresh-everyday
# 启动主进程,来管理其他进程
# 其它的uwsgi进程都是这个master进程的子进程
# 如果kill这个master进程,相当于重启所有的uwsgi进程
master = true
# 加载一个WSGI模块,这里加载wsgi.py这个模块
# 通常是在<django项目>/<和项目同名文件夹>/wsgi.py
# 但是如果chdir指定了项目绝对路径,只需要写<和项目同名文件夹>/wsgi.py
#此处根据你的实际情况修改
#module = /root/fresh-everyday/app/wsgi.py
#项目中wsgi.py文件的目录,相对于项目目录
#此处根据你的实际情况修改
wsgi-file=/root/fresh-everyday/app/wsgi.py
# 启动多少个进程,和核心数一样就行
processes = 1
# 每个进程最大的请求数
max_requests = 1000
# 运行的日志,通常放在 uwsgi_config 下
daemonize = /root/fresh-everyday/uwsgi_config/run.log
## 自动移除unix Socket和pid文件当服务停止的时候
vacuum = true
# 如果使用的是虚拟环境, 需要指定 pythonpath
# 如果是激活的是虚拟环境,使用命令:pip show django|grep -i location 即可得到
pythonpath = /home/python/virtualenvs/fresh_everyday/lib/python3.9/site-packages
# 指定pid文件,用于重启和停止,通常放在 uwsgi_config 下
pidfile = /root/fresh-everyday/uwsgi_config/uwsgi.pid
# 启用线程
enable-threads = true
#设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,
# 等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,
# 如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
reload-mercy = 8
#设置虚拟环境的路径
#virtualenv=/root/home/python/virtualenvs/fresh_everyday  # 修改点

找到uwsgi执行位置,建立软链接

find / -name uwsgi

ln -s /usr/local/python39/bin/uwsgi /usr/bin/uwsgi

uwsgi的启动和停止 (此命令在/root/fresh-everyday目录下执行)

启动:uwsgi --ini 配置文件路径

uwsgi --ini uwsgi.ini

 启动之后使用

ps -ef | grep uwsgi

查看(进程id)是否启动成功

出现以上提示才是启动成功 

如果启动不成功多半是uwsgi --ini 配置文件的问题

多多检查修改uwsgi --ini 配置文件

测试uwsgi是否成功 

新建一个uwsgi_test.py文件,并且内容如下

def application(env,start_response):
    start_response('200 OK',[('Content-Type','text/html')])
    return [b"hello,uwsgi"]

执行命令(在虚拟环境下)

uwsgi --http :8003 --wsgi-file uwsgi_test.py

执行结果

浏览器访问http://127.0.0.1:8003,如下即是成功

停止:这里先不用停止

uwsgi --stop uwsgi.pid

重启:

uwsgi --reload uwsgi/uwsgi.pid

如果在重启或者停止uwsgi服务的时候,报错signal_pidfile()/kill(): No such process [core/uwsgi.c line 1693] 

  • 找到uwsgi.ini配置文件
  • 更改pid文件中的那个id(数)为实际进程id,如:37693
  • 重新执行下重启服务的命令就好了

使用nginx,需要将uwsgi.ini配置文件中的http形式变成socket形式,重启uwsgi

配置收集静态文件

        settings.py中设置:STATIC_ROOT='收集的静态文件路径'

例如:STATIC_ROOT='/var/www/fresh_everyday/static'手动添加
        django收集静态文件的命令:python3 manage.py collectstatic 执行该命令,会把项目中所使用的静态文件收集到STATIC_ROOT指定的目录下

 修改添加nginx的配置文件(在目录/usr/local/nginx/conf下)

如果不知道在哪可以使用命令查找

find / -name nginx

vim nginx.conf
 server {
        listen       8000;//     #nginx代理服务器监听8000端口
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
           #proxy_pass http://127.0.0.1:3000;#如果安装node.js则用这个,这里不用
            uwsgi_pass 127.0.0.1:8001;     #uwsgi服务器端口,跟uwsgi.ini里面配置的一样
            #root   html;
            include /root/fresh-everyday/uwsgi_config/uwsgi_params;    #uwsgi_params文件地址,默认在//usr/local/nginx/conf,这里我更改了
            #index  index.html index.htm;
        }




        # 配置静态文件目录
        # 需要迁移静态文件,上述已经写过
        location /static {
            alias /root/fresh-everyday/static;
        }

重启nginx(在目录/usr/local/nginx/sbin下)

 ./nginx -s reload 

 云服务器开放nginx server中的端口 即8000;就可以通过服务器ip:8000 访问该项目了

但是配置有些不同,具体可以参考这篇文章:传送门

这里我们没有云服务器的话输入127.0.0.1:8000/user/login访问就可以

如果运行有什么问题的话可以看运行日志run.log(这里我放在/root/fresh-everyday/uwsgi_config目录下)然后自行解决就可以了

 项目大概搭建到这就差不多了,可能有些bug需要完善一下

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值