在Centos8上部署Django环境(Nginx+mysql+uwsgi)
前言:笔者通过阿里云的学生"在家实践计划"获得了一台2核4G的云ECS实例,并安装了Centos8镜像。于是尝试部署一套Django的生产环境。笔者选择了 Nginx + uwsgi + mysql +Python3的方式。主机自带了python3和pip3。笔者自行安装了剩下的部分。其中,mysql的安装借鉴了这篇参考博文。如有疑问欢迎大家在评区留言。
附言:以下操作,笔者都是以root身份进行的,读者以其他用户进行时,请酌情在命令前加上sudo。
本文目录
- 1.Nginx
- 1.1阿里云放通80端口
- 1.2安装nginx
- 1.3nginx管理
- 1.4nginx使用
- 2.Mysql
- 2.1安装mysql8.0
- 2.2启动mysql
- 2.3安全设置
- 3.Django
- 3.1安装django
- 3.2关联mysql
- 3.3Django项目
- 4.uWSGI
- 4.1安装uwsgi
- 4.2写项目配置文件
- 4.3写nginx配置文件
- 4.4运行
- 4.5管理
- 4.5.1安装uwsgitop
- 4.5.2管理相关命令
1.Nginx
1.1阿里云放通80端口
在阿里云的控制台中,对实例主机配置安全组,在入方向新增80端口的安全规则。配置如有疑问请参考官方说明。
1.2安装nginx
由于笔者对nginx的版本没有过多要求,此处采用dnf包管理方式安装,此处笔者dnf安装的是14.1版本。
dnf install -y nginx
安装完成后,可以查看一下版本,以验证是否正确安装。
nginx -v
1.3nginx管理
基于dnf安装的nginx已经做好了相关设置,可以使用nginx -s、systemctl对nginx进行便捷管理。
systemctl管理常用:
systemctl enable nginx #开机自启动nginx
systemctl disable nginx #开机禁止启动nginx
systemctl status nginx #查看nginx服务状态
systemctl start nginx #开启nginx服务
systemctl stop nginx #终止nginx服务
systemctl restart nginx #重启nginx服务
相比之下,笔者还是更喜欢直接使用原生的nginx自带命令
通过nginx -h 读者可以查看到nginx常用命令及说明,笔者摘录了一部分
nginx -V #查看nginx版本和配置项内容
nginx -t #检查配置文件是否正确
nginx -c 配置文件路径 #选用某一配置文件
nginx #启动nginx
nginx -s reload #重新载入配置文件
nginx -s stop #停止nginx
1.4nginx使用
systemctl start nginx #或者直接使用nginx 启动nginx服务
systemctl status nginx #若看到Active变为active(running)则启动正常
lsof -i:80 #可以看到80端口已经被nginx监听了
上面一系列检查确认nginx正常启动后,可以到浏览器输入公网地址或域名,看到nginx欢迎页。
nginx默认配置中监听80端口的配置项所在根位置,对应nginx程序安装目录下的html目录。我们通过nginx -V
可以看到,dnf安装后,nginx安装位置在/usr/share/nginx,配置文件在/etc/nginx/nginx.conf。(欢迎页就是/usr/share/nginx/html/index.html)。
笔者还是更习惯将网站目录设置在/var/www下,我们可以这样来修改:
mkdir -p /var/www/mysite #创建网站目录
cp /usr/share/nginx/html/* /var/www/mysite/ #笔者暂时没网站,先用默认
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak #备份配置文件
vim /etc/nginx/nginx.conf #打开配置文件 按i编辑
##找到其中http->listen80的server项->修改root为/var/www/mysite;
##按ESC后输入:wq 保存退出
nginx -t #测试配置文件是否修改正确
nginx -s relod #无误后重新载入配置文件
大功告成,网站目录修改成功。(准确说是80端口web内容映射的根目录位置)
2.Mysql
2.1安装mysql8.0
Centos8的dnf对懒人那是相当友好。mysql8.0的完全可以一条命令解决:
dnf install -y @mysql #@mysql模块将安装MySQL8.0及其所有依赖项
2.2启动mysql
systemctl enable mysqld #配置mysql开机自启动
systemctl start mysqld #启动mysqld
systemctl status mysqld #查看mysql是否启动成功(active running)
2.3安全设置
运行如下脚本,可以设置mysql的root密码,并引导你完成一些必要的安全设置。
mysql_secure_installation
首先,脚本会让你选择是否配置VALIDATE PASSWORD PLUGIN(密码验证插件),该插件用来检查mysql用户所设置的密码强度,只有达到一定强度的密码才允许被设置。如果你希望设置请输入y或者Y回车,不想请直接回车。若选择了配置,紧接着你将选择所采用密码验证策略的级别:
低:密码长度不少于8位
中:密码长度不少于8位,必须是数字、大小写字母、特殊字母混合。
强:密码长度不少于8位,必须是数字、大小写字母、特殊字母混合,需配合字典文件。
通常,我们选择中级别即可。
其次,将要求用户输入两次为root设置的新密码,上一步骤设置的密码验证策略将发挥作用,并对用户设置的密码强度进行打分。设置好密码以后,会提示用户是否继续采用密码保护,选择y回车。
紧接着,将询问用户是否删除匿名用户,选择y回车。
默认情况下,MySQL有一个匿名用户,允许任何人登录MySQL,而不必创建用户帐户。这仅用于测试,或者安装时更便利。但在部署生产环境之前,应该先删除匿名用户。
然后,将询问用户是否禁止以root身份远程登陆mysql,选择y回车。
通常,mysql中的root用户应只允许通过本地登陆,而不能远程登陆。这样可以降低root用户密码被爆破的风险。
此后,将询问用户是否删除测试数据库,选择y回车。
默认情况下,MySQL总有一个名为’test’的数据库,允许任何用户访问。这仅用于安装时的测试,但在部署生产环境之前,应该先删除该数据库。
最后,脚本询问用户是否现在重载 privilege tables,以使当前所有修改立刻生效。选择y回车。
当我们在终端中键入:
mysql -uroot -p #回车输入密码并确认
即可登陆mysql。
3.Django
Django作为python得力的重量级web框架,一直备受青睐。
3.1安装django
pip3 install django
3.2关联mysql
dnf install mysql-devel
pip3 install mysqlclient
3.3Django项目
django-admin startproject myproject #创建一个名为myproject的项目
cd myproject
python3 manage.py startapp dg_mypr #创建一个应用dg_mypr用来映射数据库
上述创建的应用,通过在models.py中利用Django的ORM映射数据库的表和字段,一般为了统一我们会使该应用与数据库同名。
打开项目下的配置文件settings.py
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db.sqlite3'),}
}#上述内容修改为mysql引擎,填入要连接的数据库信息
#要注意的是 这里的数据库必须是提前创建好的!!!!!
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': '数据库名','USER': 'root','PASSWORD': '密码','HOST': 'localhost',}
}
#在这里插入新创建的app
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','dg_mypr', #加入dg_mypr
]
DEBUG = True #测试中打开Debug 生产环境请关闭
ALLOWED_HOSTS = [u'*'] #修改白名单为全通
修改完成后,保存退出。
(在dg_mypr中的models.py中定义ORM映射模型的步骤略)
改好配置文件并创建模型后,我们可以使用
python3 manage.py check #确认正常连接数据库且语法正确(0 issues)
python3 manage.py makemigrations #根据模型建立migration
python3 manage.py migrate #根据migration在数据库中建立对应的表
此后若需要应用新的ORM建模,可以在清库后,删除dg_mypr/migrations目录下的__pycache__和0001_initial.py,重复上述两步操作即可。
最后,我们可以在开着debug的情况下应用runserver跑一个端口测试一下:
(确保阿里云安全策略组已开放该端口)
python3 manage.py runserver 0.0.0.0:8080 #监听8080端口建立项目服务
当浏览器访问http://公网地址:端口 后,若载入了Django欢迎页,则进入下一步骤。
4.uWSGI
4.1安装uwsgi
python3 -m pip install uwsgi
#安装完成后测试一下
uwsgi --version
4.2写项目配置文件
在项目的目录 /var/www/mysite/myproject 下创建一个ini配置文件
并创建一个目录uwsgi用来存放运行相关文件
touch myproject.ini
mkdir uwsgi
在myproject.ini中写入:
# myproject.ini
[uwsgi]
#内部转发端口 只要不被占用可随意找 需和nginx.conf里的转发口匹配
socket = :8888
#django 项目目录
chdir = /var/www/mysite/myproject
#Django 项目下 wsgi.py 文件
module = myproject.wsgi
master = true
#进程数
processes = 4
vacuum = true
#status文件,可以查看uwsgi的运行状态
stats =%(chdir)/uwsgi/uwsgi.status
#pid文件,通过该文件可以控制uwsgi的重启和停止
pidfile =%(chdir)/uwsgi/uwsgi.pid
#日志文件,通过该文件查看uwsgi的日志
daemonize =%(chdir)/uwsgi/uwsgi.log
4.3写nginx配置文件
在nginx配置文件nginx.conf中加入
server {listen 8080; #暴露给外部访问的端口 根据实际指定 确认阿里云策略组已放行server_name localhost;charset utf-8;location / {include uwsgi_params;uwsgi_pass 127.0.0.1:8888; #外部访问端口就转发到内部端口 要与项目配置文件里的一致}location /static/ {alias /var/www/mysite/myproject/static/; #项目静态路径设置}
}
写完后运行 nginx -t
检测一下是否有语法错误
然后运行nginx -s reload
重新载入配置文件
4.4运行
回到项目目录 运行 uwsgi --ini myproject.ini
即可
可运行cat uwsgi/uwsgi.log
查看一下是否正常启动了uwsgi
当看到如下内容 说明正常启动了
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 1405)
spawned uWSGI worker 1 (pid: 1413, cores: 1)
spawned uWSGI worker 2 (pid: 1414, cores: 1)
spawned uWSGI worker 3 (pid: 1415, cores: 1)
spawned uWSGI worker 4 (pid: 1416, cores: 1)
此时,运行ps aux | grep uwsgi
可查看到正在运行的uwsgi实例
4.5管理
倘若不撰写管理脚本 需要重启uwsgi时总是需要
$ ps -ax | grep uwsgi
$ kill -9 [pid]
$ uwsgi --ini myproject.ini
但是如果你按照第二步创建了uwsgi目录及相关文件,你就可以优雅地管理uwsgi进程。
4.5.1安装uwsgitop
uwsgitop是一款界面类似top的工具,用以查看指定uwsgi的全部工作进程情况。
pip3 install uwsgitop
4.5.2管理相关命令
#重启uwsgi(常常出错 还是执行stop以后start效率高)
uwsgi --reload uwsgi/uwsgi.pid
#终止uwsgi(原理是启动uwsgi进程时会把pid写入该文件)
uwsgi --stop uwsgi/uwsgi.pid
#查看uwsgi各进程工作状况
uwsgitop uwsgi/uwsgi.status
#追踪uwsgi日志及动态刷新当前访问记录
tail -f uwsgi/uwsgi.log
#启动uwsgi
uwsgi --ini myproject.ini
如果不便记忆,可将上述命令写入sh脚本文件 快捷执行。
cd uwsgi
echo "uwsgi --ini ../myproject.ini" >start.sh
echo "uwsgi --stop uwsgi.pid" >stop.sh
echo "uwsgitop uwsgi.status" >status.sh
echo "tail -f uwsgi.log">log.sh
chmod +x *.sh
可在浏览器访问项目地址,测试效果。
综上,笔者整理了自己部署环境的全过程,希望能够对读者有所帮助。后续如有其他内容,将继续补丁修正。欢迎评论指正!
在Centos8上部署Django环境(Nginx+mysql+uwsgi)相关推荐
- 在 Linux 上部署 Django 应用,nginx+gunicorn+supervisor
如果是新服务器先要进行基本的配置 部署前应用配置 开发环境与生产环境中的应用一般会有两套不同的配置.比如 DEBUG 选项,数据库配置等. 对于 setting.py 文件, 在生产环境中我们要设置 ...
- heroku创建linux主机,在 Heroku 上部署 Django 应用
在 Heroku 上部署 Django 应用 Heroku是一个很棒的平台,它有很多的控件,并且搭建环境相对来说也比较容易.本指南中,我将一步一步指导你在Heroku平台上部署一个简单地Django应 ...
- Apache上部署Django
目前,Apache和mod_python是在生产服务器上部署Django的最健壮搭配.mod_python 是一个在Apache中嵌入Python的Apache插件,它在服务器启动时将Python代码 ...
- CentOS8上部署NFS服务端和客户端
centos8上部署nfs服务端和客户端 文章目录 背景 服务端与客户端信息 配置服务端 安装软件包 编辑配置文件 验证并使配置生效 启动服务端服务 查看服务端状态: 配置客户端: 安装软件包 启动客 ...
- 部署Django到云服务器(centos+nginx+mysql+uwsgi+python3)【操作篇(1)】
开篇 笛卡尔说:"你不能教会一个人任何东西,你只能帮助他发现他自己内心本来就有的东西!" jacky能教你的,只能是经验和建议,要逆袭还得通过自己对数据的不断领悟,数据领域的技能都 ...
- 基于nginx和uWSGI在Ubuntu系统上部署Django项目
1. nginx 1.1 安装 sudo apt-get install nginx 1.2启动.停止和重启 sudo /etc/init.d/nginx start sudo /etc/init.d ...
- 如何高效快速地在Linux系统上部署Node.js+Express+MySQL的开发环境(桌面可视化)...
一.前言 可能一些初级前端和我一样,在有些项目需要前后台都一个人打通搞定的时候,对于后台和开发环境的部署还是比较头疼的.特别是Linux系统,由于没有系统接触过,也不太喜欢去记背那么多命令,大部分命令 ...
- docker部署django项目、mysql主从搭建、django实现读写分离
目录 docker部署django项目 1.1 基于python基础镜像 将本地django项目打包并发到远程服务器上 将服务器上的.zip django项目解压 部署的具体流程 1.2 基于dock ...
- 如何在Linux系统上部署接口测试环境
作为一名软件测试人员,部署测试环境是我们日常工作的一部分,今天就简单整理下接口测试环境部署的步骤,希望能够帮助到大家. 今天为大家整理的接口测试环境部署涉及到Tomcat,JDK和数据库.目前能够提供 ...
最新文章
- 各种小的 dp (精)
- 一文帮你了解小型直流有刷电机内部结构
- python学到什么程度可以写爬虫-刚开始学习 Python 到可以写出一个爬虫大约需要多长时间...
- python怎么用excel-python怎么连接excel
- JavaScript开发规范 0.01版
- shell实例第0讲:shell脚本完整pdf文档下载
- 3级联动 ajax java_java+ajax(三级连动下拉框)
- linux交叉编译+驱动,请教驱动程序交叉编译问题(初学)
- 基于TCP协议的进程间通信
- 大话设计模式C++版——代理模式
- 深度linux任务栏,Deepin系统的dde-dock任务栏出不来的有效解决方法
- 实战:第十七章:xlsx文件导入数据入库
- 自动控制原理:一阶系统的时域分析
- nginx+lua搭建文件上传下载服务
- 免费获取ps密钥_ps密钥
- Python专栏 | ICA应用:如何识别伪影信号?(一)
- Focal Loss 简介
- source insight4.0使用教程
- 中国状元”在美国读大学后对中国教育的感悟
- [R分析] 描述统计:频数和频率分布直方图
热门文章
- python轮转数组及nums和nums[:]的区别
- JavaScript JS 如何定义多行文本
- Linux随笔19-MySQL主从复制、Percona XtraBackup实现全量和增量备份、ProxySQL实现读写分离
- 网页怎么与服务器进行连接,如何实现网页与服务器的连接
- CSS选择器(id选择器,包含选择器,标签名选择器,类选择器,属性选择器,通配符选择器,伪类选择器,相邻选择器,选择器的优先级,子选择器)
- 江苏最新建筑施工塔式起重机(建筑特种作业)特种工(塔式起重机)机考题库真题及答案解析
- 古月居 ROS 入门21讲--PA16 参数的使用与编程方法
- 营销自动化权威指南_任务自动化指南
- wxWidgets(1) :mac下搭建wxWidgets 3.0 环境
- 后渗透篇:CLSID大全