项目部署
CentOS 7开机没有ip地址
方法一:输入
sudo dhclient
获取ip-
方法二:修改配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33
的ONBOOT=no为ONBOOT=yes然后service network restart即可,这样每次重启都会自动获取ip
1.MySQL部署
1.1 下载MySQL官方yum仓库
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
1.2 安装仓库
yum -y install mysql57-community-release-el7-10.noarch.rpm
1.3 安装MySQL服务器
yum -y install mysql-community-server
1.4 启动MySQL服务器
systemctl start mysqld.service
-
查看MySQL服务器运行状态
systemctl status mysqld.service
-
让MySQL开机自启
systemctl enable mysqld.service
1.5 查看MySQL初始随机密码
sudo grep "password" /var/log/mysqld.log
oszHsM/k=53B
1.6 输入初始随机密码登录MySQL
mysql -uroot -p
- 此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库
1.7 修改初始密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
初次设置密码时由于密码等级是MEDIUM,所以需要设置的密码复杂一些,若想修改密码等级,可先设置好密码后,通过以下步骤进行
-
输入以下SQL语句查看密码等级
SHOW VARIABLES LIKE 'validate_password%';
-
设置密码等级为LOW
SET global validate_password_policy=LOW;
1.8 开启MySQL的远程访问
grant all privileges on *.* to 'root'@'192.168.0.1' identified by 'password' with grant option;
若要开启所有ip访问,可将
[email protected]
替换成root@%
-
更改远程访问用户的密码
SET PASSWORD FOR root@'%'=PASSWORD('newpassword');
开启远程访问权限后就可以在win10上用数据库管理软件进行可视化操控数据库,很方便
1.9 刷新特权
flush privileges;
exit
1.10 开放3306端口给其他主机访问数据库
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
1.11 修改mysql的默认编码为utf8
-
编辑mysql配置文件
sudo vim /etc/my.cnf
-
在开头加上如下内容
[client] default-character-set=utf8
-
在
socket=/var/lib/mysql/mysql.sock
的下一行加上以下内容character-set-server=utf8 collation-server=utf8_general_ci
-
重启mysql服务
service mysqld restart
- 可在进入mysql后输入
status
查看编码是否更改成功
- 可在进入mysql后输入
2.配置虚拟环境(virtualenvwrapper)
2.1 安装virtualenvwrapper
# 更换软件源
# 阿里源 pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 豆瓣源 pip3 config set global.index-url https://pypi.douban.com/simple/
sudo pip install virtualenvwrapper
2.2 创建虚拟环境的保存目录
mkdir $HOME/.virtualenvs
2.3 修改配置shell配置文件
export WORKON_HOME=$HOME/.virtualenvs
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/bin/virtualenvwrapper.sh
source ~/.bashrc
-
如果这时出现了这个错误
-bash: /usr/local/bin/virtualenvwrapper.sh: No such file or directory
则说明找不到virtualenvwrapper.sh脚本,可以通过which命令查看脚本所在路径,然后替换到配置文件第三行的source处
which virtualenvwrapper.sh --> /usr/local/bin/virtualenvwrapper.sh
export WORKON_HOME=$HOME/.virtualenvs VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 source /usr/local/bin/virtualenvwrapper.sh
-
修改完后再重新source一下即可
source ~/.bashrc
2.4 创建python虚拟环境
-
先确定要使用的python版本的可执行程序所在路径
which python3 --> /usr/bin/python3
-
然后创建虚拟环境
mkvirtualenv -p /usr/bin/python3 虚拟环境名
-
激活虚拟环境
workon 虚拟环境名
-
退出虚拟环境
deactivate
-
虚拟环境中安装依赖包
pip install -r requirements.txt
-
requirements.txt
文件是通过在开发环境中的命令:pip freeze > requirements.txt
得到的在开发环境中所用到的依赖包,生成的文件名可以自定义,不一定要用requirements.txt
-
3.Django修改数据库为MySQL
3.1 修改settings.py的数据库引擎
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
3.2 创建数据库
CREATE DATABASE mydatabase
- mydatabase换成自己设定的数据库名
3.3 安装python的mysql模块
pip install mysqlclient
-
如果出现
mysql_config未找到命令
报错,则先安装相应的依赖库yum install mysql-devel gcc gcc-devel python-devel
再安装mysqlclient即可
4. 配置apache + mod-wsgi
4.1 安装apache
yum install httpd httpd-devel
4.2 安装mod-wsgi并部署django
4.2.1 源码方式安装与部署
-
下载源码
# 源码发布页 https://github.com/GrahamDumpleton/mod_wsgi/releases # 本wiki编写时的最新mod-wsgi下载链接 https://github.91chifun.workers.dev/https://github.com//GrahamDumpleton/mod_wsgi/archive/refs/tags/4.7.1.tar.gz # 下载方式 wget url
-
解压
tar xvfz mod_wsgi-X.Y.tar.gz
-
configure
./configure --with-python=/usr/local/bin/python
- 建议用--with-python指定要使用的python版本,一旦configure确认python版本后,之后使用mod-wsgi就要使用相应的python或相应的虚拟环境,不能切换为别的python版本,如需要切换,就要重新编译安装mod-wsgi指定不同的python版本
make && make install
-
先用官网示例的一个简单wsgi案例看看能不能正常运行mod-wsgi
# 把这行加到httpd.conf最后一行 LoadModule wsgi_module modules/mod_wsgi.so
-
新建一个目录存放示例wsgi文件
# 假设在/usr/mysite下存放wsgi文件 sudo mkdir /usr/mysite cd /usr/mysite vim mysite.wsgi
#! /usr/mysite/mysite.wsgi def application(environ, start_response): status = '200 OK' output = b'Hello World!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]
-
修改httpd.conf,将wsgi文件挂载到网站中
#! /etc/httpd/conf/httpd.conf WSGIScriptAlias /mysite /usr/mysite/mysite.wsgi # 第一个参数/mysite是浏览器访问wsgi服务器时的url -- 第二个参数是wsgi文件所在位置 # 给mysite文件夹访问权限
Order allow,deny Allow from all = 2.4> Require all granted -
重启apache服务器,浏览器访问即可
apachectl restart
如果mod-wsgi安装正确并且可以运行,那浏览器会出现Hello World!
-
如果遇到Forbiden,请检查mysite的文件所属用户和用户组是否与apache运行时的用户一致,不一致就会导致无法访问
# 查看apache运行用户 ps -ef | grep apache # 查看mysite所属用户和用户组 ls -l /usr # 或 ll /usr
-
如果遇到Internal Server Error,可以查看apache错误日志文件
sudo tail -f /var/log/httpd/error_log # -f参数是让tail命令循环运行,当文件内容变化时,就会自动运行tail命令查看末尾10行日志信息,调试的时候用该命令很方便
-
这里我遇到的问题是fopen()错误,就是apache无法打开我的wsgi文件,我已经确保文件所属用户与apache运行用户一致,甚至直接把wsgi文件和父目录都设置成了777权限依然无效,后来查到原因是CentOS 7默认是开启了SELinux的,只需要把SELinux的运行模式改为Permissive即可
sudo vim /etc/selinux/config
#! /etc/selinux/config # 将SELINUX = enforcing改为SELINUX = permissive SELINUX = permissive
- 改完后需要重启CentOS
-
-
为了方便对不同app使用不同的配置来挂载网站,可以在apache安装目录下创建一个conf_available(文件名随意,自己能认出来是干嘛用的就行)
sudo mkdir /etc/httpd/conf_available
然后把刚刚配置mysite的写在httpd.conf中的文件内容删除,在conf_available中创建一个mysite.conf,内容就是刚刚删除的那些,再把这个mysite.conf硬链接到/etc/httpd/conf.d目录下即可
#! /etc/httpd/conf_available/mysite.conf LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias /mysite /opt/mysite.wsgi DocumentRoot /opt
Require all granted sudo ln /etc/httpd/conf_available/mysite.conf /etc/httpd/conf.d
这样做的好处是以后想要配置多个django项目时,如果某个项目不想配置,想清除掉相应配置时,不需要到httpd.conf中找到相应的配置项删除了,直接把创建在conf.d的硬链接删除即可,需要添加新配置时,在conf_available中创建,然后硬链接到conf.d目录下,就像热插拔硬件一样,即插即用
-
-
部署django
-
在conf_available中创建django.conf配置文件
cd /etc/httpd/conf_available sudo vim django.conf
#! /etc/httpd/conf_available/django.conf LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias / /usr/local/www/djangoProject/djangoProject/wsgi.py WSGIPythonHome /home/plasticine/.virtualenvs/booking WSGIPythonPath /usr/local/www/djangoProject
Require all granted - WSGIScriptAlias <通过什么url可以访问你的django服务,一般设置为根目录/>
- WSGIPythonHome <你的python虚拟环境所在目录>
- WSGIPythonPath <你的django项目根目录>
标签内的路径是wsgi.py所在路径(不包括wsgi.py文件本身)
- WSGIScriptAlias <通过什么url可以访问你的django服务,一般设置为根目录/>
-
创建硬链接到conf.d目录下
sudo ln /etc/httpd/conf_available/django.conf /etc/httpd/conf.d/
-
重启apache服务器
apachectl restart
-
如果查看错误日志文件遇到
Unable to stat Python home /home/plasticine/.virtualenvs/booking. Python interpreter may not be able to be initialized correctly.
这种虚拟环境没有权限打开的问题,在django.conf配置文件中最顶部添加下面两行修改下apache的运行用户为虚拟环境所属相应用户,比如我的虚拟环境booking的所属用户是plasticine,那么就这样改User plasticine Group plasticine
然后再重启apache即可,到此为止我的apache成功让django运行起来了
-
-
配置静态文件
-
静态文件让apache处理,所以需要告诉apache,我的django项目的静态文件路径在哪里,首先切换到django的manage.py所在目录,收集静态资源文件
python manage.py collectstatic
收集静态文件之前记得现在settings.py中设置STATIC_ROOT,表示把静态文件保存在该目录下,这里我的静态资源路径是/usr/local/www/djangoProject/dist/static
-
收集静态文件完毕之后修改django.conf,如下配置
#! /etc/httpd/conf_available/django.conf User plasticine Group plasticine LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias / /usr/local/www/djangoProject/djangoProject/wsgi.py WSGIPythonHome /home/plasticine/.virtualenvs/booking WSGIPythonPath /usr/local/www/djangoProject
Require all granted Require all granted -
注意static的url连接的目录需要是这样的
Alias /static/ /usr/local/www/djangoProject/dist/static/
最后的斜杠不能丢!不能写成
Alias /static/ /usr/local/www/djangoProject/dist/static
-
-
-
- 为了正常使用预约服务,可以添加相应的url链接到相应的html,在django.conf中添加如下配置
```shell
Alias /polls /usr/local/www/djangoProject/dist/static/polls.html
Alias /data /usr/local/www/djangoProject/dist/static/data.html
Alias /putcap /usr/local/www/djangoProject/dist/static/putcap.html
```
4.2.2 pip方式安装与部署(推荐,使用简单)
-
首先workon激活项目所使用的虚拟环境
workon booking
-
pip安装mod-wsgi
pip3 install mod_wsgi
-
修改django的settings.py
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'mod_wsgi.server', # 添加这一项 )
-
收集静态资源文件
python manage.py collectstatic
-
生成单独的一个apache服务器
python manage.py runmodwsgi --setup-only --port=80 \ --user plasticine --group plasticine \ --server-root=/etc/mod_wsgi-express-80
- --user和--group写你自己django项目所属用户即可
- --server-root是生成的apache服务器保存的目录
这里可能会提示没有mod_wsgi-express-80这个文件夹,可以先创建该文件夹,并修改权限为0777,方便待会python manage.py runmodwsgi命令将文件写入
sudo mkdir /etc/mod_wsgi-express-80 sudo chmod 0777 /etc/mod_wsgi-express-80
-
切换到server-root的目录运行apache
cd /etc/mod_wsgi-express-80 sudo ./apachectl start
-
如果遇到80端口被占用,那可能是你有别的apache服务器正在运行,或者别的web服务器占用了,可以这样做
sudo netstat -tnlp
看看80端口正在被哪个进程使用
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1470/master tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 782/rpcbind tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1171/sshd tcp6 0 0 ::1:25 :::* LISTEN 1470/master tcp6 0 0 :::3306 :::* LISTEN 1250/mysqld tcp6 0 0 :::111 :::* LISTEN 782/rpcbind tcp6 0 0 :::80 :::* LISTEN 18796/httpd (mod_ws tcp6 0 0 :::22 :::* LISTEN 1171/sshd
这里可以看到,我的80端口已经有进程占用了,那可以用下面的命令指定PID杀死它
sudo kill 18796
-