CentOS8后端开发环境(LNMP)部署

前言:笔者通过阿里云的学生”在家实践计划“获得了一台2核4G的云ECS实例,并安装了Centos8镜像。于是尝试部署一套Django的生产环境。笔者选择了 Nginx + uwsgi + mysql +Python3的方式。主机自带了python3和pip3。笔者自行安装了剩下的部分。其中,mysql的安装借鉴了这篇参考博文。如有疑问欢迎大家在评区留言。
附言:以下操作,笔者都是以root身份进行的,读者以其他用户进行时,请酌情在命令前加上sudo。

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后端开发环境(LNMP)部署
http://example.com/posts/95e2d64f/
发布于
2020年2月6日
许可协议