参考资料:Django中文文档 CentOS7下部署Django项目详细操作步骤-Django社区,Django中文网,django教程,Django!
云服务器:阿里云轻量级应用服务器centos,2G内存+40G固态、
工具:Xshell6和Xftp6
之前已经部署好了一个网站,现在由于做了第二个项目,需要再做一个网站部署上去
网上看了很多博客,都没成功,最后通过qq群网友提供的这个中文文档部署成功,万分感谢!!
第一个项目,放在/home文件夹下
第一个网站部署过程:
更新系统(ubuntu)
如果是新系统的话先更新一下系统,防止版本过旧导致安装软件出现问题。
sudo apt-get update
sudo apt-get upgrade
yum安装(ubuntu)
sudo apt install yum
由于Ubuntu的一些问题,改用centos
安装python3.6依赖包
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
安装Python3.6.5
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
解压安装包
tar -xvf Python-3.6.5.tgz
将解压文件移动到 usr/local目录下
mv Python-3.6.5 /usr/local
在local目录下创建python3目录
mkdir /usr/local/python3
转到解压文件夹下配置安装目录
cd /usr/local/Python-3.6.5
./configure --with-ssl --prefix=/usr/local/python3
编译源码及安装
make && make install
配置软连接
-
首先删除原来的软连接
rm -rf /usr/bin/python
-
建立新的软连接
ln -s /usr/local/python3/bin/python3 /usr/bin/python
ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3
-
将python版本指向以前的旧版本 (yum配置文件等)
# vi /usr/bin/yum
#!/usr/bin/python2.7
# vi /usr/libexec/urlgrabber-ext-down
#!/usr/bin/python2.7
测试
安装Nginx
cd /usr/local/
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -zxvf nginx-1.8.0.tar.gz
cd nginx-1.8.0
./configure --prefix=/usr/local/nginx
make && make install
启动Nginx服务
cd /usr/local/nginx/sbin
./nginx -t #测试是否成功
./nginx
启动成功后输入域名可看到如下界面
配置Nginx
nginx一般默认安装好的路径为/usr/local/nginx
在/user/local/nginx/conf/中打开nginx.conf,加入以下内容
server {
listen 8996; #暴露给外部访问的端口
server_name localhost;
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8997; #外部访问8996就转发到内部8997
}
location /static/ {
alias /home/project/static/; #项目静态路径设置
}
}
强调:alias那一行static后必须加/,否则无法加载静态文件
安装pip3和django2.0
pip3 install django==2.0
安装uwsgi并配置
pip3 install uwsgi
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi3
安装mysql
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum -y install mysql mysql-server mysql-devel
启动mysql
service mysqld start
进入myql(第一次无密码)
mysql -u root -p
修改mysql密码
mysqladmin -uroot -p password
重启Myql
service mysql restart
django与Mysql连接工具
pip3 install mysqlclient
安装pytorch
版本:Python3.6 Cuda9.0
pip3 install torch torchvision
同步项目数据库
python manage.py makemigrations
python manage.py migrate
安装uwsgi和配置xml文件
pip3 install uwsgi
为了在终端中使用uwsgi命令,执行以下命令
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi3
在django项目下(与manage.py同级目录)新建~.xml文件(~为你的项目名称)
~.xml文件内容如下
<uwsgi>
<socket>127.0.0.1:8997</socket><!-- 内部端口,自定义 -->
<chdir>/home/www/myproject</chdir><!-- 项目路径 -->
<module>myproject.wsgi</module>
<processes>4</processes> <!-- 进程数 -->
<daemonize>uwsgi.log</daemonize><!-- 日志文件 -->
</uwsgi>
执行
首先进入root模式。
进入~.xml文件同级目录
uwsgi3 -x ~.xml
运行Nginx
cd /usr/local/nginx/sbin
./nginx
此时便已经部署完成
其他
1、静态文件依然无法加载
2.无法调用摄像头 (NotSupportedError, Only secure origins are allowed )
需要改写http为https
阿里云免费SSL证书配置Https请求
同时改写nginx.conf文件如下
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
listen 443 ssl;
server_name 47.106.39.91;
ssl_certificate cert/1823148_easydown.xin.pem;
ssl_certificate_key cert/1823148_easydown.xin.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8997;
uwsgi_param UWSGI_SCRIPT mysite.wsgi;
uwsgi_param UWSGI_CHDIR /data/wwwroot/mysite;
}
location /static/ {
alias /home/GYTJ/static/; #项目静态路径设置
}
}
}
此时可能出现的问题:unknown directive "ssl" in /usr/local/nginx/conf/nginx.conf:12
server 500
代码部分有错误(安全性方面,比如list访问错误等等
(用到了django内置model操作---》数据库表名要对应!!大小写)
重启部署
cd /usr/local/nginx/sbin
./nginx
cd /home/GYTJ
uwsgi3 -x GYTJ.xml
致此,第一个网站部署成功!!!!
第二个网站部署
1、进入Nginx的配置文件目录/usr/local/nginx/conf/,然后新建一个目录:
mkdir vhost
之后在vhost目录里建立两个以.conf结尾的文件(GYTJ.conf以及LYBB.conf),里面的内容如下:
GYTJ.conf文件夹内容:
server {
listen 80;
server_name 之前备案好的域名;
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8997; #端口要和uwsgi里配置的一样
uwsgi_param UWSGI_SCRIPT GYTJ.wsgi; #wsgi.py所在的目录名+.wsgi
uwsgi_param UWSGI_CHDIR /home/GYTJ/; #项目路径
}
location /static/ {
alias /home/GYTJ/static/; #静态资源路径
}
}
LYBB.conf文件夹内容:
server {
listen 80;
server_name 你的服务器公网ip; #有域名用域名,没有就暂时用这个
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8995; #端口要和uwsgi里配置的一样
uwsgi_param UWSGI_SCRIPT LYBB.wsgi; #wsgi.py所在的目录名+.wsgi
uwsgi_param UWSGI_CHDIR /home/LYBB/; #项目路径
}
location /static/ {
alias /home/LYBB/Segment/static/; #静态资源路径
}
}
项目路径、端口、静态资源与所属项目对应好。注意:项目里的uwsgi端口不能与另一个项目重复。
2、/usr/local/nginx/conf/目录下的原来默认的nginx.conf文件,先备份一下,然后把里面的代码删除,修改成如下代码:
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
include /usr/local/nginx/conf/vhost/*.conf;#主要是这个地方,把新建的两配置文件包含进来
server {
listen 80 default_server;
server_name _;
return 404;
}
}
3、
将本地测试好的项目,上传到第一个网站文件夹同目录下,也就是/home文件夹下
然后再在这个文件夹下新建虚拟环境,进入虚拟环境,在新的虚拟环境再装一次uwsgi,和安装项目所需依赖包,然后在项目根目录新建立一个uwsgi配置文件,里面的端口和配置文件名不要和其它项目相同,路径换成自己的项目路径。
具体步骤:
(1)创建指定版本的虚拟环境。
创建文件夹env放虚拟环境:mkdir -p /home/env
cd /home/env
virtualenv --python=/usr/bin/python3 pyweb
然后进入/home/env/pyweb/bin 启动虚拟环境pyweb
source activate
tip:退出虚拟环境命令:deactivate
(2)在虚拟环境中安装所需要的包(注意:是在虚拟环境中操作,也就是最前面有pyweb标志)
先从第一个项目文件夹下导出所需要的环境依赖包
pip freeze > requirements.txt
将这个txt文件拷贝到第二个项目文件夹下
等待所有的包安装成功
如果是用到了MySQL数据库,还需要把你的数据库文件导入进来
导入数据库到服务器。(如果用的是Mysql的话)
默认使用的是SQLite数据库,就不用做此操作。数据库原来是SQLite的,想换成Mysql,请查看文章:如何把SQLite数据库转换为Mysql数据库
如果是Mysql数据库的,则在命令行里输入:
#导出Mysql,django为你的数据库
mysqldump -uroot -ppassword django>django.sql
#把django.sql上传到服务器,在服务器里用下面命令导入
mysql -uroot -ppassword
use dajngo;
source your Path\django.sql
(3)进入虚拟环境,在新的虚拟环境pyweb再装一次uwsgi
我的第二个网站项目路径是 /home/LYBB/,在项目根目录下创建
LYBB.xml文件,输入如下内容:
<uwsgi>
<socket>127.0.0.1:8995</socket> <!-- 内部端口,自定义 -->
<chdir>/home/LYBB/</chdir> <!-- 项目路径 -->
<module>LYBB.wsgi</module> <!-- mysite为wsgi.py所在目录名-->
<processes>4</processes> <!-- 进程数 -->
<daemonize>uwsgi.log</daemonize> <!-- 日志文件 -->
</uwsgi>
保存
注意<module>里的mysite,为wsgi.py所在的目录名。
启动uwsig
uwsgi3 -x LYBB.xml
4、重启Nginx,就能成功访问。哪个项目不能访问,就把原来的uwsgi进行杀死,然后再进入对应虚拟环境,启动uwsgi即可。
先杀死所有我的第二个网站LYBB相关的进程(因为我之前试了很多方法,导致和第二个网站相关的已经在运行了)
第一个网站GYTJ相关的不要动
再通过命令 ps aux 查看所有正在运行的进程
可以发现和第二个网站LYBB相关的已经不在运行了
重启nginx
再次查看,发现第二个网站已经在运行中了
现在,就可以通过两个链接分别访问到两个网站了
第一个:http://www.xxxx.xin(第一个网站的域名)
第二个:http://公网ip
如果你有两个域名,可以把第二个换成域名访问
补充:修改代码后,需要重启uwsgi和nginx
步骤
1.在修改源码上传服务器之后,进入服务器项目目录,查看uwsgi进程
ps -ef|grep uwsgi
2.然后杀死进程
注:如果只有一个网站,可以直接杀死所有进程
killall -9 uwsgi
3.再重新启动uwsgi
4.重启Nginx