如何将本地的Django项目部署到云服务器
开发环境
- 开发语言: Python
- 后台框架:Django
- 前端框架:bootstrap
- web服务器:nginx
- wsgi服务器:uwsgi
查看本地项目Django和Python版本:
(可以直接安装Django最新版本就可以了,Python版本不能低于3.4)
Django2.0.4
Python3.6.5
首先python3的安装
首先在官网下载安装包 python-3.6.5
(直接使用wget命令下载,速度也贼快,下载完成后发现在根目录下多了一个Python-3.6.5.tgz的压缩包)安装相关包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
服务器自带的python2安装在usr/bin/目录中,可以通过
which python
命令来查看python的安装目录。
然后进入该目录,用我们熟悉的python -v来查看python版本。(其实直接在根目录下用python -v也是可以的,但which这个命令是真的可不错)利用
tar xf Python-3.6.5.tgz
命令解压解压完成后,(进入解压后的目录),编辑安装命令。
./configure --prefix=/usr/local/python3/ # 安装目录为/usr/local/python3(可以自定义安装目录)
make && make install # 编译并安装
- 提示bug: ./configure: No such file or directory
- 是因为没有进入解压后的目录,configure是安装文件里面的配置工具。
- 设置软连接
一条命令解决,再也不用配环境变量了。linux的软链接相当于windows里的快捷方式,快捷方式删了就删了,原来文件还是存在的。软连接后面也有大用。
ln -s /usr/local/python3/bin/python3 /usr/bin/python3.6
即在/usr/bin里面创建一个快捷方式python3.6,该快捷方式指向python3的安装路径。
输入python3.6 -v
测试,成功
- 可以通过以下命令查看所有的软连接:
cd usr/bin/
ls -l
可以看到python,python2,连接的都是python2.7,而python3.6连接的就是刚安装的版本
参考链接:百度经验-怎么修改软连接
- 也可以将python3.6直接改为python。
- 备份原连接为:python -> python2
- 使用ln -s /usr/local/python3/bin/python3 /usr/bin/python,建立失败,发现python已经存在。
- 删除原连接 rm /python2
- 再次建立成功。
安装各种软件
- 安装数据库
安装sqlite,mysql
yum install mysql mysql-devel
yum install sqlite-devel
- 安装pip
yum -y install python-pip
报错
[root@VM_0_12_centos bin]# yum -y install python-pip
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax
先安装get-pip
wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py
安装成功。再用python命令安装pip
python get-pip.py
安装成功,pip版本为:
Successfully installed pip-10.0.1 wheel-0.31.0
但此时未配置软连接的情况下,需要使用python -m pip来使用python3的pip。
- 安装Django
pip install django
安装失败:
This version of Django requires Python 3.4, but you're trying to
install it on Python 2.7.
This may be because you are using a version of pip that doesn't
understand the python_requires classifier. Make sure you
have pip >= 9.0 and setuptools >= 24.2, then try again:
$ python -m pip install --upgrade pip setuptools
$ python -m pip install django
This will install the latest version of Django which works on your
version of Python. If you can't upgrade your pip (or Python), request
an older version of Django:
$ python -m pip install "django<2"
2.0.5版本需要python3.4以上版本
这里因为使用的是python2的pip,为了解决这个问题可以修改软连接,也可以直接使用python -m pip install django
来指定pip为python3的。
我这里使用了第二种方法。
- 安装mysqlclient(连接器)
python -m pip install mysqlclient
报错:
OSError: mysql_config not found
加入环境变量:
PATH="$PATH":/usr/local/mysql/bin
重新安装,成功。
版本:mysqlclient-1.3.12
- 安装uwsgi
python -m pip install uwsgi
Successfully installed uwsgi-2.0.17
- 安装nginx
在线项目部署
在服务器上创建简单Django项目hello,结合uwsgi+Django+nginx。
测试uwsgi
测试uwsgi -version
显示环境变量未配置好 -bash: uwsgi: command not found
建立软连接:(好用的一匹,顺便把其他的都配了)
ln -s /usr/local/python3/bin/django-admin.py /usr/bin/django-admin.py
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
ln -s /usr/local/python3/bin/gunicorn /usr/bin/gunicorn
查看软连接:
cd /usr/bin
ls -l
建立好软连接后,查看uwsgi是否安装成功:
uwsgi --version
成功,显示:
[root@VM_0_12_centos projects]# uwsgi --version
2.0.17
继续测试,创建test.py:
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
使用uwsgi运行test.py:
uwsgi --http :8000 --wsgi-file test.py
访问http://127.0.0.1:8000/
访问失败:
localhost拒绝了我们的请求。
有毒,这些教程是真的有毒。在本地浏览器访问云服务器的时候一定要用IP地址或者域名。
访问http://www.zosurn.xyz:8000
访问成功,但出现的是seafile登录页面,说明该端口被占用了,可以释放8000端口,也可以换其他的端口。
修改端口为8002:
uwsgi --http :8002 --wsgi-file test.py
成功访问到hello world。
创建Django项目hello
在/home/projects/目录下,使用Django创建一个简单hello项目后,配置setting.py中的allowed_host设置为:
ALLOWED_HOSTS = ['.zosurn.xyz', 'localhost', '127.0.0.1']
将uwsgi与Django连接:
uwsgi --http :8008 --chdir /home/projects/hello --wsgi-file hello/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9192
访问http://www.zosurn.xyz:8008
成功,出现Django欢迎页面。
参数太多,可以将其写入ini文件中
在hello项目的目录下创建uwsgi.ini文件,写入如下内容(采用字典格式):
# hello_uwsgi.ini file
[uwsgi]
# Django-related settings
http = :8008
# the base directory (full path)
chdir = /home/projects/hello
# Django s wsgi file
module = hello.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
然后使用如下命令启动uwsgi:
uwsgi --ini uwsgi.ini
再次测试,访问http://www.zosurn.xyz:8008成功。
测试nginx:
查看nginx是否安装成功,查看nginx的版本:
[root@VM_0_12_centos hello]# nginx -v
nginx version: nginx/1.12.2
在/home/projects目录下新建一个test目录,在里面添加一个简单的html文件。然后在nginx.conf中简单配置:
events{}
http{
server{
server_name www.zosurn.xyz;
root /home/projects/test;
index index.html;
}
}
启动该nginx:(启动之前,要将/usr/local/nginx/mime.types文件复制到该nginx.conf所在目录,并且必须使用绝对路径)
nginx -c /home/projects/test/nginx.conf
如果端口被占用,则先释放该端口,则使用lsof -i :8082
查看占用端口进程的pid,并使用kill -9 [pid]关闭相应的进程。
在浏览器中访问自己的域名http://www.zosurn.xyz,访问成功。
将nginx和uwsgi以及Django结合
在hello项目的目录下创建nginx.conf
vim nginx.conf
添加如下内容:
events{}
http{
server{
listen 8082; # 如果不加的话,会默认为80,这里也可以不改
server_name www.zosurn.xyz;
root /home/projects/hello;
index index.html;
location /{
include uwsgi_params;
uwsgi_pass 127.0.0.1:8008; # 需要和ini文件中的端口保持一致,这样才能实现两者的通信。
uwsgi_read_timeout 2;
}
}
}
启动nginx:
nginx -c /home/projects/hello/nginx.conf
启动uwsgi:
uwsgi --ini /home/projects/hello/uwsgi.ini
使用域名访问,成功访问到该hello项目的Django欢迎页面。
部署本地项目到服务器
clone本地项目代码到服务器/通过ftp复制项目到服务器
在我的项目目录/home/projects里创建一个blog目录,并在里面创建一个conf目录,用来存放配置文件,这样分离开来,方便更新维护项目代码。
- home/
- projects/
- blog/
- conf/
- nginx.conf
- uwsgi.ini
- uwsgi.log
- mysite/ # 你的Django项目目录,假设为mysite
- blog/
- mysite/
- urls.py
- settings.py
- static/
- template/
- manage.py
- ...
- conf/
- blog/
- projects/
修改项目代码
修改settings.py:
DEBUG = False # Django是否加载静态资源
ALLOWED_HOSTS = ['localhost','127.0.0.1','.zosurn.xyz'] # 允许访问的主机地址
STATIC_ROOT = os.path.join(BASE_DIR, "static/") # 收集Django的静态文件到同一个static中
创建uwsgi.ini和uwsgi.log
uwsgi.ini
不变,依旧为:
# myblog uwsgi.ini file
[uwsgi]
socket = 127.0.0.1:8002
# http = :8002 如果不通过nginx可以直接用http,但要通过web服务器就必须要用socket
# the base directory (full path)
chdir = /home/projects/blog/mysite
# Django s wsgi file
module = mysite.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# clear environment on exit
vacuum = true
创建nginx.conf
# worker_rlmit_nofile 65500; # 提升nginx的进程文件打开数
events{}
http{
include mime.types;
server{
listen 80;
server_name www.zosurn.xyz;
index index.html ;
root /home/projects/blog/mysite;
location /static {
alias /home/projects/blog/mysite/static; # your Django project's static files - amend as required
}
# Finally, send all non-media requests to the Django server.
location / {
include /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
uwsgi_pass 127.0.0.1:8002;
}
}
}
创建数据库、收集静态文件
python manage.py migrate
python manage.py collectstatic
启动服务
- 启动nginx
nginx -c /home/projects/blog/conf/nginx.conf
- 后台启动uwsgi
uwsgi /home/projects/blog/conf/uwsgi.ini -d /home/projects/blog/conf/uwsgi.log
如此就可以通过域名访问自己的Django项目了。