为方便管理,在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
出现版本号即成功
安装虚拟环境
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
安装py3Fdfs 分布式文件系统
pip install py3Fdfs==2.1.0
安装jieba 结巴分词
pip install jieba
安装Pillow ImageField依赖
python -m pip install Pillow
(安装的时候可能会超时,多试几次或者换源)
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还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:
grep "password" /var/log/mysqld.log
找到root@localhost:后面的密码,copy下来
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
pip3 install 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这个模块
# 通常是在/<和项目同名文件夹>/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 --ini 配置文件路径
uwsgi --ini uwsgi.ini
启动之后使用
ps -ef | grep uwsgi
查看(进程id)是否启动成功
出现以上提示才是启动成功
如果启动不成功多半是uwsgi --ini 配置文件的问题
多多检查修改uwsgi --ini 配置文件
新建一个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]
使用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需要完善一下