Centos+Django+Apache部署
版本:
python3.6
Centos7.6
Django3.2
Apache2.4
1. 安装python3,默认3.6
yum install python3 python3-devel
2. 若与python2冲突,则删除python2开发人员版
yum erase python-devel
3. 安装Apache
yum install httpd httpd-devel
4. 下载mod_wsgi,地址`https://github.com/GrahamDumpleton/mod_wsgi/releases解压
tar xvfz mode_wsgi-X-Y.tar.gz
5. 进入解压后路径
6. 配置文件,指定python3
./configure --with-python=/usr/bin/python3
7. make
make
8. 安装mod_wsgi
make install
9. 查找mod_wsgi路径
find / -name "mod_wsgi*"
找到
/usr/lib64/httpd/modules/mod_wsgi.so
10. 打开Apache配置文件
vim /etc/httpd/conf/httpd.conf
11. 添加一行
LoadModule wsgi_module modules/mod_wsgi.so
12. 重启Apache服务
systemctl restart httpd
13. 为了直观展示文件夹结构,安装tree
yum install tree
14. 将django项目上传到/var/www/html下
/var/www/html/mysite/mysite/wsgi.py
15. 打开Apache配置文件
vim /etc/httpd/conf/httpd.conf
16. 在步骤11里我们加上的LoadModule wsgi_module modules/mod_wsgi.so
后再加入一些代码。加入后,应该像下面这样
LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias / /var/www/html/mysite/mysite/wsgi.py
WSGIPythonPath /var/www/html/mysite
<Directory /var/www/html/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Django文档里做了说明
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonHome /path/to/venv
WSGIPythonPath /path/to/mysite.com
<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIScriptAlias 行的第一项是你所期望的应用所在的基础 URL 路径( / 根 url),第二项是 “WSGI 文件” 的位置——一般位于项目包之内(本例中是 mysite)。这告诉 Apache 用该文件中定义的 WSGI 应用响应指定 URL 下的请求。
如果你在某个 virtual environment 1 内为应用安装项目的 Python 依赖,将该 virtualenv 的路径添加至 WSGIPythonHome 。参考 mod_wsgi virtualenv guide 指南获取更多细节。
WSGIPythonPath 行确保你的项目包能从 Python path 导入;换句话说, import mysite 能正常工作。
1 片段确保 Apache 能访问文件 wsgi.py 文件。
值得注意的是,假如你没有用虚拟环境,而是系统环境,那么WSGIPythonHome /path/to/venv
就不应该存在。通过对比官方文档和我上面给的代码,不难发现这一点。
17. 重启apache
systemctl restart httpd
到这里,Django已经可以说50%部署到Apache上了。剩余的50%是Django静态文件等
18. 安装mysql
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server
查看默认密码
grep "password" /var/log/mysqld.log
启动数据库
systemctl start mysqld
登录数据库
mysql -uroot -p
修改默认密码,将NewPassWord1.改成自己要设的密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassWord1.';
更改数据库编码方式
-
通过配置文件更改
vim /etc/my.cnf
加入以下代码
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'
重启数据库
systemctl restart mysqld
登录数据库,查看数据库编码
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
-
建立table后更改
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
Django编码更改,打开settings.py,找到DATABASE设置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': {'charset': 'utf8mb4'}, ... } }
19. 安装mysqlclient
pip3 install mysqlclient
若出现缺少Python.h等文件的错误,安装python3-devel
yum install python3-devel
21. Django配置,打开settings.py
...
DEBUG = False #调试关闭
ALLOWED_HOSTS = ["*"] #允许所有地址访问
...
# Application definition
INSTALLED_APPS = [
'polls.apps.PollsConfig',#注册app
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'database_name',
'USER': 'user_name',
'PASSWORD': 'password',
'HOST': '',
'PORT': '',
'OPTIONS': {'charset': 'utf8mb4'},#编码
}
}
...
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False #禁止
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static')
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
由于我们用到了名为database_name的数据库,所以需要去MySQL新建一个
CREATE DATEBASE database_name;
返回到manage.py所在文件夹,生成数据库迁移文件
python3 manage.py makemigrations
执行数据库迁移
python3 manage.py migrate
值得注意的是,每当模型改变时,都应该执行上面两句命令。
另外,注意到我们在settings.py里加入了这样一句
STATIC_ROOT = os.path.join(BASE_DIR,'static')
这是为了将Django里各个app的静态文件收集到工程文件下的static文件夹下 ,是Django部署到Apache上的必要步骤。接下来,执行收集
python3 manage.py collectstatic
将会看到/mysite/(最外层mysite)下生成了static/
21. Apache配置
编辑Apache主配置文件
vim /etc/httpd/conf/httpd.conf
经过前面的配置,你应该发现该文件最后部分如下
LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias / /var/www/html/mysite/mysite/wsgi.py
WSGIPythonPath /var/www/html/mysite
<Directory /var/www/html/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
现在,加上些新内容,让它看起来是下面这样
LoadModule wsgi_module modules/mod_wsgi.so
Alias /media/ /var/www/html/mysite/media/
Alias /static/ /var/www/html/mysite/static/
WSGIScriptAlias / /var/www/html/mysite/mysite/wsgi.py
WSGIPythonPath /var/www/html/mysite
<Directory /var/www/html/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
新加入的两行和前面Django静态文件部署相对应
Alias /media/ /var/www/html/mysite/media/
Alias /static/ /var/www/html/mysite/static/
22. 最后,清晰的目录结构如下
var/www/html/mysite/
.
|
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── polls
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── __init__.py
│ ├── migrations
│ ├── models.py
│ ├── __pycache__
│ ├── static
│ ├── templates
│ ├── tests.py
│ ├── urls.py
│ └── views.py
└── static