本文用一台安装了centos7.5系统的裸奔Linux机器(固然是虚拟机)详细讲解从无到有部署django项目的过程。html
至于什么是yum源你们请自行百度,本人用的是阿里云的yum源,所以须要在裸机上配置一下:python
cd /etc/yum.repos.d/
ls -l
1.好习惯,备份yum源mysql
mkdir repo_bak
mv *.repo repo_bak/
wget http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum install -y epel-release
推荐利用编译的方式安装Python3。linux
yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
须要注意的是,Linux系统的第三方软件都约定俗成的安装在/opt目录下~所以咱们须要把这个包下载到/opt目录下nginx
cd /opt
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
解压sql
tar -zxvf Python-3.6.5.tgz
configure数据库
进入解压出出来的Python-3.6.5目录,里面有一个绿色的可执行文件configure~django
这一步通常用来生成 Makefile,为下一步的编译作准备,你能够经过在 configure 后加上参数来对安装进行控制,好比代码:vim
./configure --prefix=/opt/py365
上面的意思是将该软件安装在 /opt/py365 下面,执行文件就会安装在 /opt/py365/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。windows
同时一些软件的配置文件你能够经过指定 --sys-config= 参数进行设定。有一些软件还能够加上 --with、--enable、--without、--disable 等等参数对编译加以控制,你能够经过容许 ./configure --help 察看详细的说明帮助。
——我这里没有加后面的参数,直接执行 ./configure,默认安装在了/usr/local/bin中~
make
这一步就是编译,大多数的源代码包都通过这一步进行编译(固然有些perl或python编写的软件须要调用perl或python来进行编译)。
若是 在 make 过程当中出现 error ,你就要记下错误代码(注意不只仅是最后一行),而后你能够向开发者提交 bugreport(通常在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些须要本身仔细研究错误代码。
make 的做用是开始进行源代码编译,以及一些功能的提供,这些功能由他的 Makefile 设置文件提供相关的功能,好比 make install 通常表示进行安装,make uninstall 是卸载,不加参数就是默认的进行源代码编译。
make 是 Linux 开发套件里面自动化编译的一个控制程序,他经过借助 Makefile 里面编写的编译规范进行自动化的调用 gcc 、ld 以及运行某些须要的程序进行编译的程序。通常状况下,他所使用的 Makefile 控制代码,由 configure 这个设置脚本根据给定的参数和系统环境生成。
make install
这条命令来进行安装(固然有些软件须要先运行 make check 或 make test来进行一些测试),这一步通常须要你有 root 权限(由于要向系统写入文件)
我本身以前总结过两篇相关的博客(原创哦~23333):
linux下虚拟环境模块virtualenv及管理工具virtualenvwrapper的使用
windows与mac下virtualenv与Pycharm的结合使用
nginx的安装也推荐编译安装!
因为本文用的是一个裸机,若是你们以前用yum安装了nginx,请卸载yum安装的nginx!!!
yum remove nginx -y
yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
我这里用的是淘宝的Tengine——在原始nginx上扩展了许多功能~很强大~
须要注意的是,Linux系统的第三方软件都约定俗成的安装在/opt目录下~所以咱们须要把这个包下载到/opt目录下
cd /opt
wget http://tengine.taobao.org/download/tengine-2.3.1.tar.gz
解压tengine包:
tar -zxvf tengine-2.3.1.tar.gz
进入源码目录:
cd tengine-2.3.1/
里面有一个绿色的可执行文件configure
这里咱们指定将tengine安装在/opt/tngx231这个目录下:
./configure --prefix=/opt/tngx231/
而后进行编译安装:
make && make install
结束后~咱们能够看到新生成了一个/opt/tngx321目录~
安装好的nginx放在了 /opt/tngx231/sbin/ 这个目录下了~
安装完成后须要每次用/opt/tngx231/sbin/ 这个目录加上nginx才能操做,很烦躁,咱们能够经过修改环境变量,之后只须要执行nginx就能够启用nginx的操做了~
echo $PATH #/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
vim /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/tngx231/sbin"
source /etc/profile
在没有修改环境变量以前,咱们须要进入nginx的安装目录(本文是在 /opt/tngx231/sbin/ )这样执行:
./nginx #启动 ./nginx -s stop #关闭 ./nginx -s reload #从新加载
修改了环境变量后能够直接这样执行:
nginx #启动 nginx -t #查看nginx状态 nginx -s stop #关闭 nginx -s reload #从新加载
测试nginx的服务
安装完成后别忘了检测一下nginx的服务
netstat -tunlp |grep 80
curl -I 127.0.0.1
结果以下:
#关防火墙 systemctl disable firewalled setenforce 0
利用virtualenvwrapper工具建立虚拟环境
mkvirtualenv whw_dj1
建立完虚拟环境后直接会进入这个虚拟环境。
在这个环境中安装项目须要的包,安装过程略(直接用pip安装便可),结果以下:
这里须要记录一下uwsgi的执行路径以及虚拟环境的目录,后面要用:
uwsgi的执行路径
特别注意:若是在虚拟环境中运行的话,后面执行uwsgi命令须要用绝对路径的时候必定是虚拟环境中的这个绝对路径!
(补充说明一点:若是虚拟环境中没有安装uwsgi模块的话会显示外部环境中的位置,所以必定要记得在虚拟环境中安装uwsgi模块!)
(whw_di1) [root@bogon opt]# which uwsgi /root/Envs/whw_di1/bin/uwsgi
虚拟环境的目录
特别注意:若是在虚拟环境中运行的话,后面uwsgi的配置文件必定要写当前虚拟环境下的uwsgi的绝对路径!
(whw_di1) [root@bogon opt]# cdvirtualenv
(whw_di1) [root@bogon whw_di1]# pwd
/root/Envs/whw_di1
将项目传到服务器的/opt目录~进入项目的二级目录,配置一下里面的settings文件,这里只写与部署相关的配置
# 线上部署必定要记得把DEBUG改为False
DEBUG = False
# 94这个ip是个人云服务器的Ip,通常状况下是这样配置 # ALLOWED_HOSTS = ['localhost','94.191.41.167','0.0.0.0:8000','127.0.0.1' ] # 本身测试的话直接allow全部的ip就行了 ALLOWED_HOSTS = ['*' ] # sqllit数据库的配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # 静态文件配置 # 第一个参数是将静态文件copy到服务器的目录的位置 STATIC_ROOT='/opt/whw_static/' STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'staticfiles'), ] ## mysql的配置——本文用的是sqllit,所以这个配置注释掉 #DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.mysql',#引擎,选mysql # 'NAME':'whw1',#要链接的数据库,链接前须要建立好 # 'USER':'root',#链接数据库的用户名 # 'PASSWORD':'123',#链接数据库的密码 # 'HOST':'127.0.0.1',#链接主机,默认本本机 # 'PORT':3306,#端口 默认3306 # #Django中设置数据库的严格模式 # 'OPTIONS':{ # 'init_command':"set sql_mode='STRICT_TRANS_TABLES' ", # } # } # }
因为uwsgi不能处理项目的静态文件,咱们须要用nginx来处理,所以须要将项目的静态文件copy到STATIC_ROOT参数对应的位置:
python3 /opt/whw/manage.py collectstatic
whw是个人项目的第一层目录,就是个人项目的名字。
提醒一点:须要提早在虚拟环境中安装好uwsgi包~~
配置uwsgi以前须要新建一个uwsgi.ini文件。
因为每一个项目对应一个uwsgi.ini文件,这里建议你们将这个文件建立在本身项目的第一层目录中:
cd /opt/whw/
touch uwsgi.ini
而后编辑这个文件
vim uwsgi.ini
文件中的配置以下:
[uwsgi] # Django-related settings # the base directory (full path) #项目的绝对路径,定位到项目的第一层 chdir = /opt/whw # Django's wsgi file # 找到项目第二层的wsgi文件 module = whw.wsgi # the virtualenv (full path) # 找到虚拟环境的绝对路径~注意最后不要加/ home = /root/Envs/whw_di1 # process-related settings # master # 主进程 master = true # maximum number of worker processes # 开启uwsgi的多进程数,根据cpu核数来定义 processes = 16 # the socket (use the full path to be safe # 基于socket连接运行项目,只有与nginx结合的时候,才使用socket形式 socket = 0.0.0.0:8000 # 当你没用nginx,调试项目的时候,使用http形式 #http = 0.0.0.0:8000 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true
# 记录pid与日志的文件 pidfile=uwsgi.pid daemonize=uwsgi.log
进入项目的第一层目录,这里有写好的uwsgi.ini文件,执行这个文件:
uwsgi --ini uwsgi.ini
特别注意,这里用的都是相对路径~真正的执行命令实际上是这样的:
/root/Envs/whw_di1/bin/uwsgi --ini /opt/whw/uwsgi.ini
——这样的执行结果是在前台运行的,咱们的终端会夯住,若是关掉这个终端uwsgi的进行也会关掉,须要咱们再打开一个终端进行下一步的操做~
——让uwsgi后台执行的话~只须要在命令里面加上-d参数就行了:
uwsgi -d --ini uwsgi.ini
nginx的配置文件是 /opt/tngx231/conf/nginx.conf 。
# 这里须要说明一下: 若是安装的是nginx不是tengine,且没有指定安装目录,那么它的配置文件默认是 /etc/nginx目录中的nginx.conf文件
编辑这个文件
vim /opt/tngx231/conf/nginx.conf
咱们只配置第一个server里面的参数:
server { listen 80; server_name localhost; location / {
# 支持uwsgi的配置 include uwsgi_params;
# ip与端口是uwsgi服务器的ip与端口~本例两者在一个机器里所以用环回地址 uwsgi_pass 127.0.0.1:8000; #root html; #index index.html index.htm; }
# 存放静态文件的配置 location /static{ alias /opt/whw_static; } # xxxxxxxxxxxxxxx }
nginx配置完后启动nginx服务:
nginx
若是中途修改了nginx.conf的参数的话,保存完后须要重启nginx服务,记得在重启前-t一下查看nginx的状态:
(whw_di1) [root@bogon whw]# nginx -t nginx: the configuration file /opt/tngx231//conf/nginx.conf syntax is ok nginx: configuration file /opt/tngx231//conf/nginx.conf test is successful (whw_di1) [root@bogon whw]# (whw_di1) [root@bogon whw]# nginx -s reload
至此,项目部署的配置就这么多了。
(1)用户发起请求
(2)访问IP(或者访问域名www.whw.com) 请求走到nginx这一层代理
(3)nginx直接转发(uwsgi_pass)给后端django的地址
(4)django处理完毕
(5)响应给nginx
(6)nginx返回结果给浏览器界面
看到最后,聪明的你确定看出端倪来了:数据库用的是sqllit!为何不用实际生产环境中经常使用的MySQL呢?
这是由于Red Hat Enterprise Linux/CentOS 7.0发行版已将默认的数据库从 MySQL 切换到 MariaDB,实际中,咱们既能够进行配置,让数据库在MySQL与MariaDB之间切换,也能够将默认的MariaDB卸载掉安装纯净版的MySQL。关于二者有什么差异我还没怎么学习。
关于数据库的相关配置会在另一篇文章中具体写一下~