Django项目本机部署

技术点

  1. 采用Nginx做反向代理,控制静态页面
  2. 采用uwsgi做业务服务器,控制动态页面
  3. 采用mysql数据库的读写分离技术,配置主从
  4. 采用redis作为缓存数据库
  5. 利用docker虚拟化技术,在一台ubuntu上运行多台容器
  6. Django项目采用前后端分离技术
  7. 图片存储功能采用FastDFS技术
  8. 搜索功能采用Elasticsearch全文搜索引擎技术

准备

  • django项目和器扩展插件已安装完成
  • 安装redis数据库
  • 安装mysql数据库
  • 安装docker容器及镜像
# 更新ubuntu的apt源索引
sudo apt-get update
# 安装包允许apt通过HTTPS使用仓库
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
# 添加Docker官方GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 设置Docker稳定版仓库
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
# 添加仓库后,更新apt源索引
sudo apt-get update
# 安装最新版Docker CE(社区版
sudo apt-get install docker-ce
# 检查Docker CE是否安装正确
sudo docker run hello-world
# 以下信息表示安装成功
Hello from Docker.....
# 为了避免每次命令都输入sudo,可以设置用户权限,注意执行后须注销重新登录
sudo usermod -a -G docker $USER
# 启动docker
sudo service docker start
# 停止docker
sudo service docker stop
# 重启docker
sudo service docker restart
  • 在docker中安装FastDFS
# 列出镜像
docker image ls
# 拉取镜像(安装) 
# 1.从官网仓库拉取(网速比较慢)
docker image pull 镜像名
# 2.加载已经下载好的镜像文件
docker image -i load 镜像名
# 删除镜像
docker image rm 镜像名或镜像id
# 创建容器
docker run [option] 镜像名 [向启动容器中传入的命令]
# 列出本机正在运行的容器
docker container ls
docker ps  # 简写 
# 列出本机所有容器,包括已经终止运行的
docker container ls --all
docker ps --all  # 简写
# 进入已经运行的容器
docker exec -it 容器名或容器id 进入后执行的第一个命令
# 删除容器
docker container rm 容器名或容器id
# 运行tracker
docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
# 停止tracker服务
docker container stop tracker
# 重新运行
docker container start tracker
# 开启storage服务, 192.168.208.130是本机ip,22122是默认port
docker run -dti --network=host --name storage -e TRACKER_SERVER=192.168.208.130:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage
# 停止tracker服务
docker container stop storage
# 重新运行
docker container start storage
# 注意
可以把Ubuntu的网络设置为Nat模式,这样网络不会随意改变
  • 安装FastDFS在python下的客户端
# 复制压缩包fdfs_client-py-master.zip到script目录下
pip install ./fdfs_client-py-master.zip
# 联网安装
pip install mutagen
pip install requests
# 把配置文件client.conf放在utils/fastdfs模块下
# connect timeout in seconds
# default value is 30s
connect_timeout=30

# network timeout in seconds
# default value is 30s
network_timeout=60

# the base path to store log files
base_path=/home/python/Desktop/mall/meiduo_29/meiduo_mall/logs

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address
tracker_server=192.168.208.130:22122

#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info

# if use connection pool
# default value is false
# since V4.05
use_connection_pool = false

# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600

# if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker=false

# if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false

# specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf

#HTTP settings
http.tracker_server_port=80

#use "#include" directive to include HTTP other settiongs
##include http.conf
  • 使用Docker安装Elasticsearch及其扩展
# 网络pull镜像
docker image pull delron/elasticsearch-ik:2.4.6-1.0
# 本地安装镜像
docker load -i elasticsearch-ik-2.4.6_docker.tar
# 复制elasticsearch-2.4.6的配置文件到python目录下
# 修改 elasticsearc-2.4.6/config/elasticsearch.yml第54行
network.host: 192.168.208.130
# 启动
docker run -dti --network=host --name=elasticsearch -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
  • 使用haystack对接Elasticsearch
# 安装 
pip install drf-haystack
pip install elasticsearch==2.4.1
# drf-haystack是为了在REST framework中使用haystack而进行的封装
# 需要注册应用与配置
  • 在Docker中安装mysql镜像
# 安装
docker image pull mysql:5.7.22
# 或
docker load -i mysql_docker_5722.tar

配置mysql主从

# 1.在/home/python创建mysql_slave
mkdir mysql_slave
cd mysql_slave
mkdir data
# 将mysql的配置文件放到此目录中
cp -r /etc/mysql/mysql.conf.d ./
# 编辑 ~/mysql_slave/mysql.conf.d/mysqld.cnf 文件
port  =  8306
general_log  = 0
server-id  = 2
# 2.创建docker容器
docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -d --network=host -v /home/python/mysql_slave/data:/var/lib/mysql -v /home/python/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d  mysql:5.7.22
# 3.在ubuntu中使用mysql命令尝试连接docker容器中的mysql
mysql -uroot -pmysql -h 127.0.0.1 --port=8306
# 4.备份主服务器原有数据到从服务器
# 主Ubuntu中
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql
# 在docker容器中导入数据
mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql
# 5.配置主服务器master(Ubuntu中的MySQL)
# 编辑设置mysqld的配置文件,设置log_bin和server-id
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
# 重启mysql服务
sudo service mysql restart
# 登入主mysql,创建用于从服务器同步数据使用的帐号
mysql –uroot –pmysql
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave';
FLUSH PRIVILEGES;
# 获取主服务器的二进制日志信息
SHOW MASTER STATUS;
mysql-bin.000001 590
# 6.配置从服务器slave (docker中的mysql)
# 进入docker中的mysql
mysql -uroot -pmysql -h 127.0.0.1 --port=8306
# 执行命令
change master to master_host='127.0.0.1', master_user='slave', master_password='slave',master_log_file='mysql-bin.000001', master_log_pos=590;
# master_host:主服务器Ubuntu的ip地址
# master_log_file: 前面查询到的主服务器日志文件名
# master_log_pos: 前面查询到的主服务器日志文件位置

# 启动slave服务器,并查看同步状态
start slave;
show slave status \G
# 以下内容表示主从配置成功
Slave_IO_Runing: Yes
Slave_SQL_Runing: Yes
  • 从服务器mysql远程登录不上的问题
# 问题
python@ubuntu:~$ mysql -uroot -pmysql -h 127.0.0.1 --port=8306
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)
# 解决方案
# 1.进入mysql所在的docker镜像容器 6c1c5ca8dda7 是id
exec -ti 6c1c5ca8dda7 /bin/bash
# 2.进入mysql
mysql -uroot -pmysql
# 3.修改权限
grant all on *.* to 'root'@'127.0.0.1' identified by 'mysql';
# 4.刷新权限
flush privileges;

安装Nginx

  1. 创建www组与www用户
sudo groupadd  www 
useradd  -g www -s /usr/sbin/nologin www
  1. 解压nginx 软件
# 推荐解压到python目录下
tar -zxvf nginx-1.8.1.tar.gz
  1. 配置nginx
cd nginx-1.8.1
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
# 说明
# --prefix 指定安装的目录,不能和自己下载的文件目录重了
# http_stub_status_module  状态监控
# http_ssl_module 配置https
# stream  配置tcp得转发
  1. 执行配置
# 带用户的方式
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
  1. 执行编译安装
make && make install 
# 注意:安装完成后,会有4个目录
# conf目录:配置文件所在的目录 nginx.conf
# html目录:网站的根目录
# logs目录:是记录日志信息的目录
# sbin目录:是命令目录
  1. nginx的启动管理
# 启动
/usr/local/nginx/sbin/nginx
# 停止
/usr/local/nginx/sbin/nginx -s stop
# 重启
/usr/local/nginx/sbin/nginx -s reload
# 查看端口情况
ps aux | grep nginx

Django静态文件部署

  1. Django运行在生产模式时不再提供静态文件的支持,所以收集所有静态文件
  • 收集Django提供的静态文件到front_end_pc/static文件中
# dev.py配置收集静态文件的保存目录
STATIC_ROOT = os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 'front_end_pc/static')
# 执行收集命令
python manage.py collectstatic
  1. 复制front_end_pc到ubuntu桌面
  2. 配置nginx, 由nginx控制静态页面
sudo vim /usr/local/nginx/conf/nginx.conf
# 在server部分中配置
user root;
server {
        listen       80;
        server_name  www.meiduo.site;
        location / {
             root   /home/python/Desktop/front_end_pc;
             index  index.html index.htm;
         }
}
# 重启Nginx服务器
  1. 测试
# 可以访问了, 此时后端服务器不再运行
www.meiduo.site
# 可以访问静态页面 index.html goods/1.html 
  1. 问题获取不到静态页面图片
# 删除/var/fdfs/storage/data目录下的fdfs_storaged.pid文件
# 删除docker中的storage镜像
docker container stop storage
cd /var/fdfs/storage/data
rm fdfs_storaged.pid
# 启动storage
docker container start storage

Django动态接口

# DEBUG
DEBUG = False
# 添加白名单
CORS_ORIGIN_WHITELIST = (
    '127.0.0.1:8080',
    'localhost:8080',
    'www.meiduo.site:8080',
    'api.meiduo.site:8000',
    'www.meiduo.site',  # 添加
)	
  • 修改wsgi.py文件
# 此时使用的配置文件为prod.py
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meiduo_mall.settings.prod")
  • 安装
pip install uwsgi
  • 在项目目录/meiduo_mall 下创建uwsgi配置文件 uwsgi.ini
[uwsgi]
#使用nginx连接时使用,Django程序所在服务器地址
socket=127.0.0.1:8001
#直接做web服务器使用,Django程序所在服务器地址
#http=127.0.0.1:8000
#项目目录
chdir=/home/python/Desktop/mall/meiduo_29/meiduo_mall
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=meiduo_mall/wsgi.py
# 进程数
processes=4
# 线程数
threads=2
# uwsgi服务器的角色
master=True
# 存放进程编号的文件
pidfile=uwsgi.pid
# 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的
daemonize=uwsgi.log
# 指定依赖的虚拟环境
virtualenv=/home/python/.virtualenvs/meiduo_mall
  • 启动uwsgi服务器
# 启动
uwsgi --ini uwsgi.ini
# 启动后会生成uwsgi.pid和uwsgi.log的文件
# uwsgi.pid存放uwsgi进程pid
# uwsgi.log记录日志
# 停止
uwsgi --stop uwsgi.pid
  • 测试uwsgi服务器
# 注释uwsgi.ini中的socket=127.0.0.1:8001
# 打开http=127.0.0.1:8000
#此时,uwsgi服务器不经过nginx直接运行
# uwsgi的启动文件是wsgi.py文件,所以修改启动时的配置文件,
# 在项目目录下,运行uwsgi,
uwsgi --ini uwsgi.ini
# 查看是否启动
ps aux | grep uwsgi
# 或者查看uwsgi.log和uwsgi.pid

# 此时点击注册页面,点击图片验证码,如果可以正常出来,就代表可以正常运行了.此时界面可以完成注册.
  • 问题uwsgi启动不了
# 查看uwsgi.log文件.启动不了的原因应该是端口号被占用
# 此时uwsgi要用8000端口号,查看8000端口号被谁占用,强杀
# 有时候需要用root模式才能强杀
sudo -s
# 查出端口被谁占用
netstat  -anp | grep 8000
kill -9 进程号
# 一般情况下是被之前启动的nginx占用了,此时要把nginx的所有进程杀死
ps aux | grep nginx
# 之后再启动uwsgi
  • uwsgi可以正常运行以后,停止uwsgi服务器
uwsgi --stop uwsgi.pid
# 查看确认停掉
ps aux | grep uwsgi
# 注释http=127.0.0.1:8000
#打开socket=127.0.0.1:8001
  • 配置nginx
  • sudo vim /usr/local/nginx/conf/nginx.conf 进入配置文件
    #gzip  on;
    upstream meiduo {
    # 此处为uwsgi运行的ip地址和端口号     
    server 127.0.0.1:8001;  
    # 如果有多台服务器,可以在此处继续添加服务器地址
     }
    
    # 监听动态文件
    server {
         listen  8000;
         server_name api.meiduo.site;
		# 配置转发规则
         location / {
             include uwsgi_params;
             # uwsgi_pass 127.0.0.1:8001;
             uwsgi_pass meiduo;
         }
     }

     # 监听前端静态文件
     server {
         listen       80;
         server_name  www.meiduo.site;
         #charset koi8-r;
         #access_log  logs/host.access.log  main;
         # 访问xadmin/ckeditor时交给meiduo
         location /xadmin {
             include uwsgi_params;
             uwsgi_pass meiduo;
         }
         location /ckeditor {
             include uwsgi_params;
             uwsgi_pass meiduo;
         }
         # 默认访问index.html
         location / {
             root   /home/python/Desktop/front_end_pc;
             index  index.html index.htm;
         }

         error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }
     }
  • 启动或者重启nginx
# 启动
/usr/local/nginx/sbin/nginx
# 重启
sudo /usr/local/nginx/sbin/nginx -s reload
  • 可能出现的问题
# 1.此时图片可能有加载不出来,按照之前问题解决
# 2.如果此时nginx启动不了.报错 nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (13: Permission denied)
cd /usr/local/nginx/logs/
# 删除error.log
rm error.log
# 再次启动
  • 测试
# 此时,所有功能有以实现,可以用www.meiduo.site访问
api.meiduo.site/xadmin  # 访问后台
www.meiduo.site/xadmin  # 也可以访问xadmin后台
  • 最后修改
# 修改payment应用的views.py文件中支付宝回调网址
return_url="http://www.meiduo.site:8080/pay_success.html",
# 去掉8080, 修改为
return_url="http://www.meiduo.site/pay_success.html",
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值