##题
django因其开发速度快,功能齐全受到开发者的青睐。本文旨在指导大家从零开始,完成整个项目的部署。工具选择:
估计绝大数人都有一个很大的疑惑,为什么要用这么多工具,用这么大的篇幅配置。我们开发的时候,当你敲下
runserver
这个命令django的会自动构建一个开发服务器.但是,这个不能用于生产环境。主要是两个原因,一是在真正的部署以后,用户的请求量大,稳定性要求比较高,测试服务器满足满足不了。二是,测试服务是无法长期保持进程。当你的回话关闭后,服务也随着停止。
Nginx:
是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势
uwsgi:
是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
运行过程:
nginx作为服务器的最前端,它将接受WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是nginx的强项,静态文件像我们django博客项目中的static文件夹下面的图片,css,js)。然后nginx将所有的非静态请求(像显示文章的详细信息,通常这类信息都保存在数据库,因此需要调用数据库获取数据)通过uwsgi传递给Django,由django来处理,从而完成一次WEB请求。uwsgi的作用就类似一个桥接器,起到桥梁的作用
你首先得购买一个阿里云的服务器,并且完成安全组等的配置。同时,root账号拥有更改系统文件的权限,在其账号下直接部署项目有非常大的安全风险。一般情况下,需要专门建立一个用户部署你的项目。
本着不重复造轮子的原则,请参照我之前一篇博文。从零开始配置阿里云GPU服务器训练深度学习模型,其中详细说明了其配置方法。
添加按照提示,添加新用户
sudo adduser bamboo
给新用户添加sudo权限
usermod -aG sudo bamboo
给新用户添加root权限
usermod -aG root bamboo
阿里云服务器默认安装的python2.7版本。但我们为了后期维护的方便性,我们使用python3版本的django,因此,为了不影响其他软件的使用。需要创建一个环境专门管理我们的系统。这样也方便后期一个服务器上部署多个系统。创建虚拟环境有很多方法,有virtual、anaconda等,也可以直接讲系统默认python切换为python3.
将默认python版本切换为python3
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
sudo apt-get update#更新apt
sudo apt-get install python3-pip#安装pip3
并且更新pip
sudo -H pip3 install --upgrade pip
安装制定版本的django
sudo -H pip3 install django==1.11.8
因为开发需要,我们还需要安装djangorestframework
sudo -H pip3 install djangorestframework
我们的项目都是在开发服务器开发完成,最后在云服务器上进行部署。直接将github上的代码clone到云服务器。并配置代码更新时,手动或自动拉取远程库的代码,并重启服务。
首先需要生成公钥并粘贴到远程服务器中
生成公钥
ssh-keygen -t rsa -C "邮箱名称"
查看公钥
cat /home/用户名/.ssh/id_rsa.pub
在远程库配置云服务器公钥
将项目clone到云服务器
git clone [email protected]:项目名称.git
当然你也可以通过scp方式传送部分文件
scp /home/bamboo/project/db.sqlite3 bamboo@远程服务器地址:/home/bamboo/laboo_equipment/sbgl_jerrywang
为了配置程序的访问地址,修改setting文件。这其中就包含默认地址,静态文件的地址,还有网址。
# 设置可以访问的域名
ALLOWED_HOSTS = ['*', 'www.域名.com','127.0.0.1','远程ip地址']
STATIC_URL = '/static/'
部署时用 python manage.py collectstatic 就可以把各应用下及公共的静态文件收集到(复制到) STATIC_ROOT 目录
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')
在开发服务器中,会自动按照STATICFILES_DIRS》》》各应用下static文件查找css,js文件。当部署到生产服务器时,直接到STATIC_ROOT中查找,而不去其他地方查找。
python manage.py collectstatic
在启动开发服务器之前,必须采用查看安全组是否已经开放其端口,并且查看防火墙是不是已经开放这个端口。当端口号小于1024时,需要root权限才能访问。因此,不要设置端口号小于1024
python manage.py runserver 0.0.0.0:8081
常见错误:
Error: That port is already in use.
解决方法:
查看开放的端口,选择一个未被占用的端口
sudo netstat -nlp#查看端口情况
Error: You don't have permission to access that port.
解决方法:
不要设置端口号小于1024
解决方法:
查看防火墙状态
sudo ufw status
开启对应的端口号,如8080端口
sudo ufw allow 8080
其次,查看阿里云安全组设置,是否开启相关的端口号。
以上所有内容主要是为了测试django是否安装正确,系统能否正常访问。启动服务还是采用开发服务器启动的。下面将正式通过服务器程序管理django程序。
首先,就需要安装uwsgi
sudo -H pip install uwsgi
安装成功后
......
Installing collected packages: uwsgi
Successfully installed uwsgi-2.0.17
我们可以通过命令行快速测试uwsgi是否工作。
#无虚拟环境的情况下
uwsgi --http :8081 --chdir /home/bamboo/welldaq -w wellDAQ.wsgi
#有虚拟环境的情况下
uwsgi --http :8081 --home /home/bamboo/anaconda3/envs/welldaq --chdir /home/bamboo/welldaq -w wellDAQ.wsgi
输出以下内容:
*** Starting uWSGI 2.0.17 (64bit) on [Sat May 19 17:13:00 2018] ***
compiled with version: 5.4.0 20160609 on 19 May 2018 08:29:28
os: Linux-4.4.0-121-generic #145-Ubuntu SMP Fri Apr 13 13:47:23 UTC 2018
nodename: laboo_aliyun
.......
如果不报错,就是正常。
并在浏览器中,测试一下是否是通的。你会发现页面没有css和静态文件
通过以上操作,已经完全可以访问页面了。但是存在一个问题,无法长期访问,无法自动配置多线程。且无法访问静态文件。下面所有内容均是为了解决以上问题。
以上通过命令启动的uwsgi服务,每次启动都需要敲一遍命令。也无法自动化运行。因此,我们需要写一个配置文件把启动内容固化下来。
sudo mkdir -p /etc/uwsgi/sites
sudo vim /etc/uwsgi/sites/welldaq.ini
创建文件,并写入编辑配置文件
[uwsgi]
project=wellDAQ
uid=bamboo
base=/home/%(uid)
projectdir=welldaq
chdir=%(base)/%(projectdir)
home=%(base)/anaconda3/envs/%(projectdir)
module=%(project).wsgi:application
master=true
processes=5
socket=/run/uwsgi/%(project).sock
chown-socket=%(uid):www-data
chmod-socket=660
vacuum=true
文件意思:
socket :指定项目执行的端口号
chadir :指定项目的目录
module :可以这么来理解,对于- myweb_uwsgi.ini文件来说,与它的平级的有一个easyblog目录,这个目录下有一个wsgi.py文件
master :允许主线程存在(true)
processes:开启的进程数量(这里是开启4个进程)
vacuum :当服务器退出的时候自动清理环境,删除unix socket文件和pid文件
配置文件的含义未完待续
uwsgi配置含义说明
uwsgi中文官方文档
我们已经完成了配置文件,但系统无法自动运行我们的服务。我还需要等待nginx配置完成。
配置文件已经完成,我们需要配置一个系统文件,让其自动管理我们的uwsgi服务。
更多推荐阅读Linux 系统启动过程,将会详细解析,linux系统管理的相关内容。
sudo vim /etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI Emperor service
[Service]
ExecStartPre=/bin/bash -c 'mkdir -p /run/uwsgi; chown bamboo:www-data /run/uwsgi'
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
[Install]
WantedBy=multi-user.target
配置文件的含义未完待续
安装nginx
sudo apt-get install nginx
编辑nginx配置文件
sudo vim /etc/nginx/sites-available/welldaq
server {
listen 80;
server_name 47.*.*.*;
location = /favicon.ico {access_log off;log_not_found off;}
location /media {
alias /path/to/project/media;
}
location /static {
alias /home/bamboo/welldaq/collected_static;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/wellDAQ.sock;
}
}
配置文件的含义未完待续
连接配置文件
sudo ln -s /etc/nginx/sites-available/welldaq /etc/nginx/sites-enabled/
配置文件语法检查
sudo nginx -t
检查结果如下,表用语法正常
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重启nginx服务
sudo systemctl restart nginx
阿里dns解析配置
SSL证书>证书控制台>下载>nginx
下载证书并解压
可以看到两个文件:xx.key, xx.pem
采用SCP将文件传送至服务器端
scp ./xx.pem [email protected]:/etc/nginx/certs/
重新修改nginx配置文件
server {
listen 80;
listen 443 ssl;
ssl_certificate /etc/nginx/certs/xx.pem;
ssl_certificate_key /etc/nginx/certs/xx.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;
ssl_prefer_server_ciphers on;
server_name www.**.cn;
location = /favicon.ico {access_log off;log_not_found off;}
location /media {
alias /home/bamboo/laboo_equipment/sbgl_jerrywang/media;
}
location /static {
alias /home/bamboo/laboo_equipment/sbgl_jerrywang/collected_static;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/sbgl_jerrywang.sock;
client_max_body_size 2048m; # 表示最大上传2G
}
}
现在我们可以启动我们的uwsgi服务了
sudo systemctl start uwsgi
如果以上所有配置正常,就可以正常访问了。但是,很多情况下,会出现一些错误。这是,根据错误提示,进行错误排查就非常重要了。
网站上线后,不可避免的,要进行版本迭代和更新。通过git进行版本管理是个非常好的方法。在代码更新后,进行相应的操作,让系统重新运行起来。
在正常开发过程中,采用git做版本管理时。我在开发分支进行程序开发。测试无误之后才将代码合并到主分支。在拉取代码前,请检查pull的远程分支是否正确。
git pull#默认拉取默认分支
如果程序更新时,静态文件发生变化,重新收集一下静态文件。
python manage.py collectstatic
重启服务最简单的方法就是重启一下服务器。如果服务器上有其他应用无法重启。你可以重启一下服务。
sudo systemctl restart nginx
sudo systemctl restart uwsgi
sudo find / -name nginx.conf
/etc/init/nginx.conf
/etc/nginx/nginx.conf
sudo vim /etc/nginx/nginx.conf
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
sudo tail -f /var/log/nginx/access.log
113.139.214.121 - - [21/Sep/2018:21:51:22 +0800] "GET /accounts/userlist/ HTTP/1.1" 200 617 "https://www.equipmentmaster.cn/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
113.139.214.121 - - [21/Sep/2018:21:51:23 +0800] "GET /message_system/user_notify_detail HTTP/1.1" 200 2 "https://www.equipmentmaster.cn/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
113.139.214.121 - - [21/Sep/2018:21:51:28 +0800] "GET /index05 HTTP/1.1" 200 13750 "https://www.equipmentmaster.cn/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
113.139.214.121 - - [21/Sep/2018:21:51:28 +0800] "GET /static/img/logo.png%20 HTTP/1.1" 404 209 "https://www.equipmentmaster.cn/index05" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
1.100.109.195.91 :
$remote_addr : 客户端(用户)IP地址
2.[17/Feb/2017:00:08:11 +0800]:
‘$time_local’ :访问时间
3.“GET /data/upload/shop/common/loading.gif HTTP/1.0” :
$requestget请求的url地址(目标url地址)的host
4.200:
'$status请求状态(状态码,200表示成功,404表示页面不存在,301表示永久重定向等,具体状态码可以在网上找相关文章,不再赘述)
5. 134 :
$body_bytes_sent :请求页面大小,默认为byte
6.“http://www.mall121.com/” :
“$http_referer” : 来源页面,即从哪个页面转到本页,专业名称叫做“referer”
7.“Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0; Windows NT 6.1; SLCC2 2.5.5231; .NET CLR 2.0.50727; .NET CLR 4.1.23457; .NET CLR 4.0.23457; Media Center PC 6.0; MS-WK 8)”:
$http_user_agent:用户浏览器其他信息,浏览器版本、浏览器类型
8. “140.205.201.12” :
$http_x_forwarded_for"
2018/09/21 22:35:25 [error] 805#805: *30 open() "/home/bamboo/laboo_equipment/sbgl_jerrywang/collected_static/img/logo.png " failed (2: No such file or directory), client: 113.139.214.121, server: www.equipmentmaster.cn, request: "GET /static/img/logo.png%20 HTTP/1.1", host: "www.equipmentmaster.cn", referrer: "https://www.equipmentmaster.cn/sb_info/sbinfo"
2018/09/21 22:36:59 [error] 805#805: *63 open() "/home/bamboo/laboo_equipment/sbgl_jerrywang/collected_static/img/logo.png " failed (2: No such file or directory), client: 113.139.214.121, server: www.equipmentmaster.cn, request: "GET /static/img/logo.png%20 HTTP/1.1", host: "www.equipmentmaster.cn", referrer: "https://www.equipmentmaster.cn/index03"
未完待续,持续更新
Job for uwsgi.service failed because the control process exited with error code. See "systemctl status uwsgi.service" and "journalctl -xe" for details.
systemctl status uwsgi.service
● uwsgi.service - uWSGI Emperor service
Loaded: loaded (/etc/systemd/system/uwsgi.service; disabled; vendor preset: enabled)
Active: inactive (dead)
uwsgi.service: Failed at step EXEC spawning /usr/local/bin/uwsgi: No such file or directory
sudo systemctl enable nginx
Synchronizing state of nginx.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable nginx
sudo systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/uwsgi.service to /etc/systemd/system/uwsgi.service.
sudo tail -F /var/log/nginx/error.log #查看输出错误
sudo systemctl status uwsgi
chown -R lamport:users *
功能:更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文件拷贝给用户xu,为了让用户xu能够存取这个文件,root用户应该把这个文件的属主设为xu,否则,用户xu无法存取这个文件。
语法:chown [选项] 用户或组 文件
说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户I D。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。 该命令的各选项含义如下:
-R 递归式地改变指定目录及其下的所有子目录和文件的拥有者。
-v 显示chown命令所做的工作。
chgrp和chown 的都是转移文件属主 但是chown只能在同一个用户组里面转换而chgrp可以转移到不同的用户组