阿里云服务器部署django项目
一:购买云服务器并连接
1.购买阿里云服务器(centos)后,给的一个公共IP
2.XShell连接此IP—>用户名root—>public key
此时不使用public key,而使用密码的方式,应该做如下操作:
1. 回到阿里云界面,点击更多,找到密码/密钥,点击修改远程连接密码
2. 点击重置密码,重置后,重启阿里云服务,强制重启
3.回到XShell,输入密码,连接阿里云服务
Welcome to Alibaba Cloud Elastic Compute Service!
显示上述即成功连接
二:部署项目代码
centos + uwsgi+nginx部署django项目
1.安装python3.6
提前安装好系统依赖包:
centos:
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++ openssl-devel libffi-devel python-devel mariadb-devel
ubuntu:
sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libmysqlclient-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-dev libffi-dev libc6-dev
1. 获取
wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz
tar -xzvf Python-3.6.2.tgz -C /tmp
cd /tmp/Python-3.6.2/
2. 把Python3.6安装到 /usr/local 目录
./configure --prefix=/usr/local
make
make altinstall
3. 更改/usr/bin/python链接
ln -s /usr/local/bin/python3.6 /usr/bin/python3
2.安装maridb和redis
注:maridb即MySQL
1. 安装
sudo yum install mariadb-server
2. 启动, 重启
sudo systemctl start mariadb
sudo systemctl restart mariadb
3. 设置bind-ip
vim /etc/my.cnf
在 [mysqld]:
下面加一行
bind-address = 0.0.0.0
4. 设置外部ip可以访问
先进入mysql才能运行下面命令:
mysql 直接进入就行
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
刷新权限后,再次访问。---->mysql -uroot -p
----->Enter Password:123456
重新启动maridb ----->sudo systemctl restart mariadb
5. 设置阿里云的对外端口
注意:此时主机的navicat还连接不了该数据库。
原因:阿里云好多端口并未对外开放,可以在阿里云实力列表中设置。
设置:打开实例列表,点击更多,找到网络和安全组,点击安全组配置,点击配置规则,
进去后点击快速创建规则,此时在弹出的界面中选中所有的常用端口。
最下方有个授权对象,点击教我设置,直接选中案例四(只允许实例访问外部特定IP地址)
中的授权对象,复制过去。同时也可以自定义端口:8000/8000,点击保存。
此时在点击navicat的连接测试,显示成功!
6. 安装mysqlclient出问题
centos 7:(依赖中安装过python-devel mariadb-devel等)
yum install python-devel mariadb-devel -y
ubuntu:
sudo apt-get install libmysqlclient-dev
然后:(执行此条命令)
pip install mysqlclient
7.安装redis
yum install redis
启动redis:service redis start
查看进程:ps aux|grep redis
进入redis:redis-cli
3.安装nignx
官网: https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7
1.sudo yum install epel-release
2.sudo yum install nginx
3.sudo systemctl start nginx
此时可以查看一下进程是否启动了nginx:ps aux|grep nginx
4.安装virtualenvwrapper虚拟环境
1.yum install python-setuptools python-devel
2.pip install virtualenvwrapper
3.编辑.bashrc文件: vim ~/.bashrc
将以下两行代码,复制到文件最末尾(虚拟环境放在哪?激活virtualenvwrapper.sh)
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
然后wq保存退出。
激活.bashrc文件:source ~/.bashrc
注意此时可能会说找不到该文件(/usr/local/bin/virtualenvwrapper.sh)
不同系统,这个文件的安装路径可能不同,此时应该查询当前系统该文件的所在位置。
查询/usr/local/bin/virtualenvwrapper.sh文件位置:sudo find / -name virtualenvwrapper.sh
查找到该文件的路径后复制到.bashrc文件的最后一行(source /usr/local/bin/virtualenvwrapper.sh)
保存后,重新激活该文件:source ~/.bashrc
4.新建虚拟环境
mkvirtualenv -p python3 venv
5.进入虚拟环境
workon venv
退出虚拟环境:deactivate
6.上传本地文件(代码或文件)到云服务器
在Linux或mac系统中直接使用scp命令即可
在windows中,1.使用filezilla或Winscp工具拖拽文件到云服务器(使用步骤百度)
2.在pycharm专业版中,Tools-->Deployment-->Configuration-->
点击'+'号,选择SFTP后命名-->在Connection中配置(Advanced中的不用管)
-->点击Mappings(本地文件夹和线上文件夹进行映射)-->选择一个线上目录(Deployment path)
-->可以选择线上的root目录,新建文件夹(文件夹名和项目名称一致)-->点击OK
***怎么上传文件到线上呢?
选中某个目录文件-->Tools-->Deployment-->Upload to 文件名(时间会很长建议使用2方式)
7.安装依赖包(前提:项目文件已经上传到云服务器)
***进入虚拟环境中安装依赖包(workon venv)
安装项目中所需要的依赖包--->可以将项目中的依赖包写入到requirements.txt中,此文件放到根目录同级。
--->使用pip install -r requirements.txt
只要项目中所有的依赖包都安装完毕即可!
8.可以同步MySQL数据库中的数据到云服务器,navicat中云服务器新建数据库,在本机数据库中进行数据传递即可。
返回至settings.py中,修改:ALLOWED_HOSTS = ['*'];修改数据库配置,之后使用:选中settings.py-->Tools-->Deployment-->Upload to 文件名
9.启动服务
python manage.py runserver 0.0.0.0:8000
注意:此时可能会报错,查看以下哪些包没有安装
启动成功后,即可在本机输入ip地址:8000进行访问
5.安装uwsgi
pip install uwsgi
6. 测试uwsgi
uwsgi --http :8000 --module 和项目同名的文件.wsgi
注意:此条命令必须在项目根目录下执行
pwd查看当前目录
和项目同名的文件.wsgi,此文件包含:__init__.py,settings.py,urls.py,wsgi.py
注意:此时强制刷新页面,静态文件将失效
7. 配置nginx
可以先在项目中新建一个conf文件夹(根目录下一级),conf中再新建nginx,uwsgi文件夹,在nginx文件夹中新建
uc_nginx.conf文件,将以下内容复制进去。
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
server_name 你的ip地址 ; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias 你的目录/Mxonline/media; # 指向django的media目录
}
location /static {
alias 你的目录/Mxonline/static; # 指向django的static目录
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}
注:
server_name 你的IP地址:即云服务器IP
location /media 你的目录:pwd查看项目目录,即/root/项目名/media
解释:
后续nginx关于url中含有media的,nginx都会自己去读取该文件并返回,不在使用django去代理
修改完毕后,将该配置文件上传到云服务器。
8.通过配置文件启动uwsgi
步骤如上。
新建uwsgi.ini 配置文件
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = 项目根目录
# Django's wsgi file
module = 和项目名同名文件.wsgi
# the virtualenv (full path)
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = 127.0.0.1:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
virtualenv = 虚拟环境路径
logto = /tmp/mylog.log
注意:
修改上边代码中的文字部分
chdir: 表示需要操作的目录,也就是项目的目录
module: wsgi文件的路径
processes: 进程数
virtualenv:虚拟环境的目录
启动:(在配置文件目录下执行)
uwsgi -i uwsgi.ini
9.将uc_nginx.conf配置文件加入到nginx的启动配置文件中
1.建立软连接
sudo ln -s 项目根目录/conf/nginx/uc_nginx.conf /etc/nginx/conf.d/
2.将配置文件复制/etc/nginx/conf.d/
cp uc_nginx.conf /etc/nginx/conf.d/
3.修改/etc/nginx/nginx.conf配置文件中的user
vim /etc/nginx/nginx.conf
将顶部user nginx;修改为user root;
4.重启nginx
sudo systcmctl restart nginx
5.查看nginx进程
ps aux|grep nginx
6.直接强制刷新本机IP地址栏,把8000端口去掉后回车
注意:
此时nginx只会查找到根目录下的static静态文件,其他文件夹中的单独static是找不到的
如何解决:
见标题10
10.拉取所有需要的static file 到同一个目录
在django的setting文件中,添加下面一行内容:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
(添加完毕后,别忘记将settings.py上传到云服务)
在项目根目录下,运行命令
python manage.py collectstatic
收集完毕后,刷新页面,如果出现502,即uwsgi服务挂了,重启即可
此时,所有的静态资源都能够正确加载出来。
uwsgi,nginx是在后台运行的,如果想要重启uwsgi服务,使用:pkill -f uwsgi
三:使用域名访问
1.去万网购买域名
购买过后去配置域名,还需要去备案,备案过程可百度,解析域名
注意:
使用域名后,还需要将uc_nginx.conf中的server_name 改为域名地址,然后上传云服务器,
上传过后,将此配置文件拷贝只/etc/nginx/conf.d,重启nginx服务即可。
注意
部署到生产环境前,务必要将DEBUG = True改为False!!!