部署过程中主要发生一下几个事情,个人认为也是经常出现的问题难点,所以这里以问题的形式进程说明。
1. centos系统的python3-mysql-虚拟环境
的安装及相关配置
这个就不再详细说明,具体参考之前写的文章:
阿里云Linux系统配置python3-虚拟环境-mysql --踩坑实践(Ubuntu系统转centOS7)
2. 项目数据上传服务器及相关配置
文件上传及数据库迁移
- 利用
pycharm
的Tools–>Deployment–>Configuration进入如图1所示界面,在图2中根据服务器情况进行配置。配置完成后将文件上传到服务器。
- 数据库配置:
在服务器上创建数据库,并创建用户及授权
create database mydb charset utf8;
use mydb;
创建用户
create user ‘[用户名称]’@’%’ identified by ‘[用户密码]’;
创建用户。’localhost’,代表只能本地访问,例如root账户默认为‘localhost‘。
mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';
创建用户。’%’:所有远程主机访问。
mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'some_pass';
授权
用户授权数据库。*代表整个数据库
GRANT privileges ON databasename.tablename TO ‘username’@’host’ [with grant option ]
with grant option:允许被授予权限的人把这个权限授予其他的人。
一般用不到。实际中,数据库权限最好由 DBA 来统一管理。
mysql> GRANT SELECT,UPDATE ON test to testuser21
授权用户只能本地访问
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'localhost'
-> WITH GRANT OPTION;12
授权用户可以远程访问
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%'
-> WITH GRANT OPTION;12
– finley对test有所有权限。
mysql> GRANT ALL PRIVILEGES ON test.* TO 'finley'@'%' IDENTIFIED BY 'some_pass';12
-- finley对test有select,delete,update,create,drop权限。
mysql> GRANT SELECT,DELETE,UPDATE,CREATE,DROP ON test.* TO finley@'%' IDENTIFIED BY 'some_pass';12
重新载入赋权表
mysql> FLUSH PRIVILEGES;1
要远程连接,还需要设置/etc/mysql/mysql.conf.d/mysqld.cnf
#只允许localhost访问
#bind-address = 127.0.0.1
bind-address = 0.0.0.0123
解除授权
revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from”:
--解除用户所有数据库(表)的所有权限(不包含赋权权限)
mysql> REVOKE ALL PRIVILEGES ON *.* FROM finley;
--解除赋权权限
mysql> REVOKE GRANT OPTION ON *.* FROM finley; 1234
删除用户
mysql> DELETE FROM mysql.user WHERE user='finley';1
设置与更改用户密码
SET PASSWORD FOR ‘username’@’host’ = PASSWORD(‘newpassword’);
如果是当前登陆用户用:
SET PASSWORD = PASSWORD(“newpassword”);
mysql> SET PASSWORD FOR 'finley'@'%' = PASSWORD("123456");
修改settings.py
文件
- 将
ALLOWED_HOSTS = ['127.0.0.1','服务器对外ip']
或者ALLOWED_HOSTS = [‘*’]
- 配置static根文件目录:
STATIC_ROOT = os.path.join(BASE_DIR,'static_dist')
- 将数据库的配置信息进行核对和修改
- 测试成功后,将
DEBUG = False
测试
进入项目根目录运行如下命令,在浏览器中查看,对比DEBUG
关闭前后状态:
# 注意这里需要开启服务器对应端口的访问权限
python manage.py runserve 0.0.0.0:8000
收集静态文件
python manage.py collectstatic
3. uwsgi安装、测试及配置
安装
因为centos系统中的python3是后来配置的,这里需要先执行如下命令,在安装,否则直接安装会报错:
yum install python-dev
安装uwsgi:
pip install uwsgi
ps:uwsgi模块不能安装再虚拟环境中,退出虚拟环境在linux环境中安装!
测试
在项目的根目录文件下创建一个名为test.py的文件文件内容如下:
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
完成后,在该目录下,执行如下命令,然后访问对应的ip和端口,查看是否返回Hello World
,返回就说明成功:
uwsgi --http :80 --wsgi-file test.py
在项目部署中,会使用uwsgi --ini uwsgi.ini
命令运行,这里对于存在多版本的python时,就会出现类似的错误如下:
WSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
Python version: 2.7.5 (default, Aug 7 2018 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
Set PythonHome to /root/.virtualenvs/env3dj
ImportError: No module named site
解决此类错误的办法有几个,分别如下:
- 官方:Bonus: 多版本 Python 使用同一个 uWSGI 二进制文件
- 在python3的环境下,即使用
pip3 install uwsgi
安装uwsgi到python3的目录中,软后使用软链接将ln -s /usr/local/python3Dir/bin/uwsgi /usr/bin/uwsgi3
;在执行命令时修改为:uwsgi3 --ini uwsgi.ini
配置
关于uwsgi的文件配置,都是与nginx相互配合的,这里我们使用socket也配置:
在项目根目录下创建一个名为:uwsgi.ini的文件,配置如下:
[uwsgi]
# Django相关配置
# 必须全部为绝对路径
# 项目路径
chdir=/home/study/django/django_01
# Django的wsgi文件
module=django_01.wsgi
# python虚拟环境的路径
home=/root/.virtualenvs/django_01
# 进程相关的设置
# 主进程
master=true
# 最大数量的工作进程
processes=10
# socket文件路径,绝对路径
# 该路径自己指配,但是要保持与nginx/conf.d中配置的.socket路径一致
socket=/var/run/django_01.sock
# 设置socket的权限 绝对路径
chmod-socket=666
# 退出时是否清理环境
vacuum=true
# 日志记录
#logoto = /tmp/django_01_uwsgi.log
常用的uwsgi命令:
#启动:uwsgi –-ini 配置文件路径 例如:
uwsgi –-ini uwsgi.ini
#停止:uwsgi --stop uwsgi.pid路径 例如:
uwsgi –-stop uwsgi.pid
4. Nginx安装、测试及配置
安装
首先,我们还要先添加 EPEL 包的仓库源。使用如下命令
yum -y install epel-release
然后再执行安装Nginx命令。
yum -y install nginx
安装完成后,启动nginx
# 启动
service nginx start
# 关闭
service nginx stop
# 重启
service nginx restart
测试
安装完成后,可以直接在本地的浏览器上,访问,服务器的ip,看界面是否返回一个nginx界面。
配置
在目录/etc/nginx/conf.d
下创建一个xxx.conf的文件,文件配置如下:
upstream django_01{
server unix:///var/run/django_01.sock;
}
# 服务器配置
server {
# 监听端口
listen 80; # 建议80端口
# 域名
server_name xxx.xxx.xxx.xxx;# 域名或服务器ip
charset utf-8;
# 最大文件上传尺寸
client_max_body_size 75M;
# 静态文件访问的url
location /static {
# 静态文件地址
alias /home/study/django/django_01/static_dist;
}
# 最后,发送所有的非静态文件请求到django服务器
location / {
uwsgi_pass django_01;
# uwsgi_params文件地址
include /etc/nginx/uwsgi_params;
}
}
每次更改nginx文件后,都需要重启。
配置完成后,执行如下命令,无错误时,就可以使用对应的ip或者域名进行网站的访问了。
uwsgi --ini uwsgi.ini
注意事项
- 关于使用socket进行服务器间通信,
xxx.sock
文件存放的目录,不建议放在所有的/tmp/
文件下,因为在uwsgi
运行时,unix
自觉将tmp
文件没有访问权限。 - 建议放在
var/run/
文件下,否则可能因为文件权限问题导致报502的错误。
*3 connect() to unix:///tmp/djangoblog.sock failed (2: No such file or directory) while connecting to upstream, client:
配置uwsgi+nginx可能报502错误的解决办法 参考链接:
https://serverfault.com/questions/504901/nginx-502-bad-gateway-runing-django-in-uwsgi