Location匹配、LVMP架构、BBS服务部署
目录1、Location匹配
-
Location匹配规则
匹配符 匹配规则 优先级 = 精确匹配 1 ^~ 以某个字符串开头 2 ~ 区分大小写的正则匹配 3 ~* 不区分大小写的正则匹配 3 / 通用匹配,任何请求都会匹配到 4
案例演示
[root@web01 conf.d]# cat test.conf
server {
listen 80;
server_name _;
location / {
default_type text/html;
return 200 "Hello World";
}
location ~* /python {
default_type text/html;
return 200 "Location ~*";
}
location ~ /Python {
default_type text/html;
return 200 "Location ~";
}
location ^~ /python {
default_type text/html;
return 200 "Location ^~";
}
location = /python {
default_type text/html;
return 200 "Location =";
}
}
注:
1、server_name后面的 ‘_’ 指的是可以使用任意域名进行访问
2、‘=’为精确匹配,精确匹配不遵循先后顺序,总是优先进行匹配,在匹配到以后不再进行其他的匹配规则
3、除去精确匹配外,其他的匹配规则都遵循匹配的先后顺序,且匹配到一个就停止匹配
2、LNMP架构
LNMP是一套技术的组合,L=Linux、N=Nginx、M~=MySQL、P~=Python
webApp采用python的web框架Django开发
首先Nginx服务是不能处理动态请求,那么当用户发起动态请求时, Nginx又是如何进行处理的。
8转交给后端的Python程序处理
2.2、uwsgi
因为nginx不支持wsgi协议,无法直接调用py开发的webApp。
在nginx+uWsgi+Django的框架里,nginx代理+webServer,uWsgi是wsgiServer,Django是webApp。
nginx接收用户请求,并判定哪些转发到uWsgi,uWsgi再去调用pyWebApp。
2.1、uWSGI简介
1、什么是uWSGI
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http 等协议。Nginx中HttpUwsgiModule的作用是与uWSGI 服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
2、WSGI / uwsgi / uWSGI的区别
1、WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程 序)通信的一种规范。相当于一个桥梁。连接 服务器与应用程序。服务器方调用应用程序,提供环境信息,以及一 个回调函数,并接收web内容作为返回值
2、uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
3、而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
4、uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
3、浏览器请求一个页面的流程
1、浏览器发送请求给服务器,包含请求头和请求体
2、服务器解析请求头和请求体
3、服务器根据请求信息来处理请求,生成返回内容
4、服务器生成响应头和响应体
5、服务器返回响应给浏览器,浏览器显示给用户
- 浏览器请求一个页面的流程(图1/图2/图3)
2.3、uwsgi服务部署
1、创建用户
[root@web01 opt]# groupadd django -g 888
[root@web01 opt]# useradd django -u 888 -g 888 -r -M -s /bin/sh
2、安装依赖软件
[root@web01 opt]# yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y
3、安装Django和uwsgi
[root@web01 opt]# pip3 install django
[root@web01 opt]# pip3 install uwsgi
4、创建项目
[root@web01 opt]# cd /opt
[root@web01 opt]# django-admin startproject linux # 创建linux项目
[root@web01 opt]# cd linux # 切换到linux项目目录里
[root@web01 opt]# django-admin startapp app01 # 在linux项目里创建一个app01
[root@web01 linux]# vim linux/settings.py # 在linux项目里编辑配置文件
ALLOWED_HOSTS = ['*'] # 将配置文件里的该项添加为允许任意ip访问
DATABASES = {} # 将配置文件里的数据库修改为空
5、启动测试
[root@web01 linux]# python3 manage.py runserver 0.0.0.0:8000
'''
浏览器输入本机ip地址,端口号为8000,出现django界面说明项目配置成功,但是我们只能通过python服务去启动,uwsgi是由c语言开发的,所以在运作速度上要比python快很多,所以下面我们要对uwsgi进行相关的配置,使我们可以通过uwsgi去代理django服务
'''
6、编辑项目配置文件
创建项目配置文件
[root@web01 linux]# vim /opt/linux/myweb_uwsgi.ini
将以下配置信息写入文件中并保存
[uwsgi]
# 端口号
socket = :8000
# 指定项目的目录(路径可以是相对路径也可以是绝对路径)
chdir = /opt/linux
# wsgi文件路径(路径可以是相对路径也可以是绝对路径)
wsgi-file = /opt/linux/linux/wsgi.py
# 模块wsgi路径
module = linux.wsgi
# 是否开启master进程(master是对我们的work进程进行实时监控的)
master = true
# 工作进程的最大数目(工作进程指的就是worke进程数)
processes = 4
# 结束后是否清理文件(结束后清理一些垃圾文件)
vacuum = true
7、启动uwsgi
[root@web01 linux]# uwsgi -d --ini /opt/linux/myweb_uwsgi.ini --uid 666
参数介绍:
-d : 以守护进程的方式运行(即在后台运行)
--ini :指定配置文件的路径
--uid :指定启动的用户id(一般不以root用户运行)
'''
执行完上述步骤后我们在浏览器访问会发现访问失败,这是因为uwsgi支持TCP协议,而我们通过浏览器访问使用的是HTTP协议,之前说过,TCP协议包括HTTP协议,但是HTTP协议不包括TCP协议,所以这里我们需要将HTTP协议转化为TCP协议,即通过我们的nginx服务代理来完成下面的协议转换
8、编辑nginx配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/python.conf
server {
listen 80;
# 域名,需要在本机电脑的hosts文件里进行域名解析
server_name py.test.com;
location / {
# uwsgi_params是适用于python服务的设置,存在于/etc/nginx下
include uwsgi_params;
# 后面8000端口要和/opt/linux/myweb_uwsgi.ini文件中的socket保持一致
uwsgi_pass 127.0.0.1:8000;
# 访问超时的时间
uwsgi_read_timeout 2;
# 定义UWSGI_SCRIPT变量,和/opt/linux/myweb_uwsgi.ini文件中的moudle保持一致
uwsgi_param UWSGI_SCRIPT linux.wsgi;
# 定义UWSGI_CHDIR变量,和/opt/linux/myweb_uwsgi.ini文件中的chdir保持一致
uwsgi_param UWSGI_CHDIR /opt/linux;
index index.html index.htm;
client_max_body_size 35m;
}
}
9、重启nginx服务
[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 ~]# systemctl restart nginx
10、测试
浏览器通过以下网址进行访问
http://www.py.com/
11、压力测试
通过压力测试来对比uwsgi和python以及nginx对静态请求的一些反馈结果
3、部署BBS项目
1、部署数据库
[root@db01 ~]# yum install mariadb* -y
2、启动数据库
[root@db01 ~]# systemctl start mariadb
3、登录mysql
[root@db01 ~]# mysql
3、远程连接MySQL数据库(在mysql里执行)
1、创建用户
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; # root > 用户名;123456 > 密码
2、连接
MariaDB [(none)]> FLUSH PRIVILEGES;
3、创建数据库
MariaDB [(none)]> CREATE DATABASE `bbs` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
4、部署bbs (返回到web01服务器进行操作)
1、上传代码
解压
[root@web01 ~]# unzip bbs.zip
移动到/opt/目录下
[root@web01 ~]# mv bbs /opt/
2、数据库迁移
1、切换到 /opt/bbs/app01/migrations目录下,将__init__.py文件的其他文件全部移除
[root@web01 ~]# cd /opt/bbs/app01/migrations
[root@web01 migrations]# rm -rf 00*
[root@web01 migrations]# rm -rf __pycache__/
2、切换到 /opt/bbs/目录下进行后续操作
[root@web01 migrations]# cd /opt/bbs/
3、修改django版本
卸载django
1、关闭linux项目进程
[root@web01 bbs]# ps -ef | grep uwsgi
www 2829 1 0 21:42 ? 00:00:00 uwsgi -d --ini /opt/linux/myweb_uwsgi.ini --uid 666
www 2831 2829 0 21:42 ? 00:00:00 uwsgi
www 2832 2829 0 21:42 ? 00:00:00 uwsgi
www 2833 2829 0 21:42 ? 00:00:00 uwsgi
www 2834 2829 0 21:42 ? 00:00:00 uwsgi
root 3264 1957 0 23:55 pts/0 00:00:00 grep --color=auto uwsgi
[root@web01 bbs]# kill -9 2829
2、卸载django
[root@web01 bbs]# pip3 uninstall django
3、安装1.11版本django
[root@web01 bbs]# pip3 install django==1.11
4、安装mysql数据库插件
[root@web01 bbs]# pip3 install pymysql
5、修改数据库连接
[root@web01 bbs]# vim bbs/settings.py
ALLOWED_HOSTS = ['*'] # 允许任意ip进行访问
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'bbs', # 数据库名称
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库用户密码
'HOST': '172.16.1.61', # 数据库的ip地址
'PORT': 3306,
'CHARSET': 'utf8'
}
}
6、创建数据库迁移文件
[root@web01 bbs]# python3 manage.py makemigrations
7、数据库迁移
[root@web01 bbs]# python3 manage.py migrate
3、配置uwsgi配置文件
1、配置uwsgi配置文件
[root@web01 ~]# vim /opt/bbs/myweb_uwsgi.ini
[uwsgi]
# 端口号
socket = :8002
# 指定项目的目录
chdir = /opt/bbs
# wsgi文件路径
wsgi-file = bbs/wsgi.py
# 模块wsgi路径
module = bbs.wsgi
# 是否开启master进程
master = true
# 工作进程的最大数目
processes = 4
# 结束后是否清理文件
vacuum = true
2、启动uwsgi
[root@web01 ~]# uwsgi -d --ini /opt/bbs/myweb_uwsgi.ini --uid 666
4、配置nginx配置文件
1、配置nginx配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/bbs.conf
server {
listen 80;
server_name bbs.test.com;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8002;
uwsgi_read_timeout 2;
uwsgi_param UWSGI_SCRIPT bbs.wsgi;
uwsgi_param UWSGI_CHDIR /opt/bbs;
index index.html index.htm;
client_max_body_size 35m;
}
2、重启nginx
[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 ~]# systemctl restart nginx
5、测试访问bbs服务
浏览器输入http://bbs.test.com/