20.集群架构之LNMP部署项目

1.location

使用Nginx Location可以控制访问网站的路径, 
一个server可以有多个location配置, 多个location按优先级来匹配.
1.1匹配符号
匹配符匹配规则优先级
=精确匹配1
^~以某个字符串开头2
~区分大小写的正则匹配3
~*不区分大小写的正则匹配3
/通用匹配,任何请求都会匹配到4
1.2测试
# 将默认的配置文件隐藏处理
[root@web01 conf.d]# mv default.conf .default.conf 
[root@web01 ~]#  vim /etc/nginx/conf.d/test.conf       
server {
    listen 80;
    server_name _;

    location / {
        default_type text/html;
        return 200 "hello world";
    }   
}
测试
http://192.168.15.7/

image-20220106194710387

1.3优选级测试
1.级别1
server {
    listen 80;
    server_name _;
   
    location ~* /python {  # 3
        default_type text/html;
        return 200 "Location ~*";
    }

    location ~ /Python {  # 3 注重是大写的哦
        default_type text/html;
        return 200 "Location ~";
    }

    location ^~ /python {  # 2
        default_type text/html;
        return 200 "Location ^~";
    }

    location = /python {   # 1
        default_type text/html;
        return 200 "Location =";
    }
}

image-20220106195221392

2.级别2
删除 location = /python {...}
nginx -t
systemctl  restart nginx

image-20220106195741034

3.级别3
 删除 location ^~ /python { ... }
nginx -t
systemctl  restart nginx

image-20220106200427737

4.级别4
 删除 location ~* /python { ... }
nginx -t
systemctl  restart nginx

image-20220106201435770

2.游戏的图片

2.1nfs服务器设置
把超级玛丽里面的图片都移动到opt目录里面去同时把这个images共享到nfs服务器里面去。
目前超级玛丽的路径       /opt/Super_Marie
超级玛丽里面的图片路径   /opt/Super_Marie/images
# 1.创建一个目录
[root@nfs ~]# mkdir /opt/img
# 2.
[root@nfs ~]# vi /etc/exportsvi /etc/exports
/opt/img  172.16.1.0/20(rw,sync,all_squash,anonuid=666,anongid=666)
在末尾添加
# 3.设置权限
[root@nfs ~]# chown -R www.www /opt/img/
# 4.重启服务
[root@nfs ~]# systemctl restart nfs-server rpcbind
# 5.检查
[root@nfs ~]# showmount -e
Export list for nfs:
/opt/img    172.16.1.0/20
/web/upload 172.16.1.0/20
2.2web01服务器设置
# 1.创建挂载点
[root@web01 ~]# mkdir /opt/image
# 2.挂载
[root@web01 ~]# mount -t nfs 172.16.1.31:/opt/img /opt/image
# 3.查看
[root@web01 ~]# df
...
172.16.1.31:/opt/img      9947136 2726272   7220864  28% /opt/image
# 4.移动图片到nfs服务器
[root@web01 opt]# mv /opt/Super_Marie/images /opt/image/
# 提示没权限还是移动过去了
mv: failed to preserve ownership for ‘/opt/image/images’: Operation not permitted
[root@web01 ~]# ll /opt/image/
total 0
drwxr-xr-x 2 www www 329 Jan  6 20:58 images
# 5.修改配置文件
vim /etc/nginx/conf.d/all_game.conf  
server {
    listen 80;
    server_name 172.16.1.7;  
    location / {
        root /opt/Super_Marie/;  # 代码的路径
        index index.html;   # 启动脚本
    }
}
[root@web01 opt]# 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 opt]# systemctl  restart nginx
访问 http://192.168.15.7/
现在存在的缓存文件,清空缓存,再刷新就没有了

image-20220106204825807

image-20220106205015005

image-20220106205046379

# 5.修改配置文件 添加一个location路由
vim /etc/nginx/conf.d/all_game.conf  
server {
    listen 80;
    server_name 172.16.1.7;  
    location / {
        root /opt/Super_Marie/;  # 代码的路径
        index index.html;   # 启动脚本
    }
    location ~ /images {  # 区分大小写
    root /opt/image/;  # 图片的路径
    }
}
# 6.测试配置文件
[root@web01 opt]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 7.重启服务
[root@web01 opt]# systemctl  restart nginx
8.测试成功!

image-20220106210500898

2.2web02服务器使用
# 1.建一个yum源
[root@web02 ~]# vi /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
:wq
# 2.安装
[root@web02 ~]# yum install -y nginx
# 3.启动
[root@web02 ~]# systemctl start nginx
# 遇到冲突 systemctl stop httpd 
# 4.访问网页测试
192.168.1.8

image-20220106211838107

# 5.创建目录
[root@web02 ~]# mkdir /opt/Super_Marie
[root@web02 ~]#cd /opt/Super_Marie
把文件拖进去,忽略 images 
images文件夹也无法拖的

image-20220106212002031

# 6.创建挂载点
[root@web02 Super_Marie]# mkdir /opt/image
# 7.挂载
[root@web02 Super_Marie]# mount -t nfs 172.16.1.31:/opt/img /opt/image
# 8.查看
[root@web02 Super_Marie]# df
...
172.16.1.31:/opt/img      9947136 2726400   7220736  28% /opt/image
# 9.编辑配置文件
[root@web02 Super_Marie]# vim /etc/nginx/conf.d/all_game.conf  
server {
    listen 80;
    server_name 172.16.1.8;  
    location / {
        root /opt/Super_Marie/;  # 代码的路径
        index index.html;   # 启动脚本
    }
    location ~ /images {  # 区分大小写
    root /opt/image/;  # 图片的路径
    }
}
# 10. 测试配置文件
[root@web02 Super_Marie]#  nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 11. 重启服务
[root@web02 Super_Marie]#  systemctl  restart nginx
# 12.成功访问
http://192.168.15.8/

image-20220106212942503

3.LNMP架构

LNMP是一套技术的组合,L=Linux、N=Nginx、M~=MySQL、P~=Python

当用户发起http请求,请求会被Nginx处理,如果是静态资源请求Nginx则直接返回,如果是动态请求Nginx则通过uwsgi协议转交给后端的Python程序处理.
(Nginx服务是不能处理动态请求.)

1.静态请求:请求的内容是静态文件就是静态请求
    1.1 静态文件:文件上传到服务器,永远不会改变的文件就是静态文件
    2.2 html就是一个标准的静态文件
2.动态请求:请求的内容是动态的就是动态请求
    2.1 不是真实存在服务器上的内容,是通过数据库或者其他服务拼凑成的数据
3.1uwsgi
因为nginx不支持wsgi协议,无法直接调用py开发的webApp。  
uwsgi支持python的开发并且,效果更好,运行速度更快.
*:不同的组件之间传递信息涉及到数据格式和协议的转换
在nginx+uWsgi+Django的框架里,nginx代理+webServer,uWsgi是wsgiServer,Django是webApp。
nginx接收用户请求,并判定哪些转发到uWsgi,uWsgi再去调用pyWebApp。
3.2uwsgi服务部署
Django+uWSGI+nginx 部署

django 一个pyhton的开源web框架。
uWSGI 一个基于自有的uwsgi协议、WSGI协议和http服务协议的web网关
nginx 常用的代理服务器

WSGI:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。 
# 1.创建用户
[root@web01 ~]# groupadd django -g 888
[root@web01 ~]# useradd django -u 888 -g 888 -r -M -s /bin/sh
# 2.安装依赖软件
[root@web01 ~]# yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y
# 3.安装Django和uwsgi
[root@web01 ~]# pip3 install django
[root@web01 ~]# pip3 install uwsgi
# 4.创建项目
[root@web01 ~]# cd /opt         
# linux 项目名称
[root@web01 opt]# django-admin startproject linux
[root@web01 opt]# cd linux
# 创建app01
[root@web01 opt]# django-admin startapp app01
[root@web01 linux]# ll
total 4
drwxr-xr-x 3 root root 123 Jan  6 22:17 app01
drwxr-xr-x 2 root root  89 Jan  6 22:16 linux
-rwxr-xr-x 1 root root 661 Jan  6 22:16 manage.py
# 修改配置文件
[root@web01 linux]# vim linux/settings.py
# 28 行 与 76行
28行 * 表示所有ipd都可以访问
ALLOWED_HOSTS = ['*']
76行
DATABASES = {  
}

image-20220106230207833

image-20220106230313730

# 5.启动
[root@web01 linux]# python3 manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
January 06, 2022 - 14:22:58
Django version 3.2.11, using settings 'linux.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
6.浏览器访问
一般情况不会这样去启动,python的承载不行,
所有使用c语言编写的uwsgi来启动.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IyNKMyJI-1641644974334)(C:\Users\13600\AppData\Roaming\Typora\typora-user-images\image-20220106230659564.png)]

# 6.1访问之后 结束 manage.py  ctrl + c
# 6.2如果不行就是要下面的方法, 选择自己对应的端口号
[root@web01 linux]# sudo netstat -tulpn | grep :8000
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      2378/python3        
[root@web01 linux]# kill -9 2378
[root@web01 linux]# sudo netstat -tulpn | grep :8000
# 7.uwsgi配置文件
vi /opt/linux/myweb_uwsgi.ini 

[uwsgi]
# 端口号
socket            = :8000
# 指定刚才创建的项目的目录
chdir =       /opt/linux
#cd /opt/linux
#ll linux/ 
就可以看到wsgi.py这个文件
# wsgi文件路径

wsgi-file       = linux/wsgi.py
# 模块wsgi路径
module          = linux.wsgi
# 是否开启master进程
master          = true
# 工作进程的最大数目
processes       = 4
# 结束后是否清理文件
vacuum          = true
# 8. 使用www用户启动uwsgi
[root@web01 linux]#uwsgi  --ini myweb_uwsgi.ini --uid 666
"""
-d 	  : 以守护进程方式运行
--ini : 指定配置文件路径
--uid : 指定uid
"""
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 2416)
spawned uWSGI worker 1 (pid: 2418, cores: 1)
spawned uWSGI worker 2 (pid: 2419, cores: 1)
spawned uWSGI worker 3 (pid: 2420, cores: 1)
spawned uWSGI worker 4 (pid: 2421, cores: 1)
....
# 开启服务出不来了 先断开 xshell 在重新连接
现在启动的 uwsgi是TCP 协议
网站是通过 HTTP 协议访问
将配置ngnix 实现互通
# 9.编辑配置文件
[root@web01 nginx]# vi /etc/nginx/conf.d/py.conf
server {
    listen 80;
    server_name py.test.com;
    location / { 
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
        uwsgi_read_timeout 2;
        uwsgi_param UWSGI_SCRIPT linux.wsgi;
        uwsgi_param UWSGI_CHDIR /opt/linux;
        index  index.html index.htm;
        client_max_body_size 35m;
    }
}
# 10.测试配置文件
[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 11.重启服务
[root@web01 conf.d]# systemctl restart nginx
# 12.域名解析 windows 电脑上修改
C:\Windows\System32\drivers\etc\hosts

172.16.1.7  py.test.com

image-20220106233907054

13.测试访问

image-20220106233934365

3.3压力测试对比
[root@web01 linux]# ll
total 8
drwxr-xr-x 3 root root 123 Jan  6 22:17 app01
drwxr-xr-x 3 root root 108 Jan  6 22:22 linux
-rwxr-xr-x 1 root root 661 Jan  6 22:16 manage.py
-rw-r--r-- 1 root root 425 Jan  6 22:30 myweb_uwsgi.ini
# 使用8001端口
[root@web01 linux]# python3 manage.py runserver 0.0.0.0:8001
[root@web01 linux]# python3 manage.py runserver 0.0.0.0:8001
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
January 06, 2022 - 15:15:26
Django version 3.2.11, using settings 'linux.settings'
Starting development server at http://0.0.0.0:8001/
Quit the server with CONTROL-C.
# 监听状态

image-20220107090033940

# 使用  nginx代理
# 1. 编辑配置文件
vi /etc/nginx/conf.d/py.conf
server {
    listen 80;
    server_name py.test.com;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
        uwsgi_read_timeout 2;
        uwsgi_param UWSGI_SCRIPT linux.wsgi;
        uwsgi_param UWSGI_CHDIR /opt/linux;
        index  index.html index.htm;
        client_max_body_size 35m;
    }
}

server {
    listen 80;
    server_name py1.test.com;
    location / {
        proxy_pass http://127.0.0.1:8001;
    }
}
# 2.测试配置文件
[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 3.重启服务
[root@web01 conf.d]# systemctl restart nginx
# 4.启动 py
python3 manage.py runserver 0.0.0.0:8001
# 5.配置NDS解析
C:\Windows\System32\drivers\etc\hosts
添加
172.16.1.7     py.test.com   py1.test.com 
# 6.测试
py.test.com 
py1.test.com 

image-20220107100202664

image-20220107100139708

# 7.在linux设置DNS解析
# 新开一个xshell 连接 linux, 之前的xshell 启动着Python的程序
[root@web01 ~]# vi /etc/hosts
172.16.1.7     py.test.com   py1.test.com  
# 8.测试
[root@web01 ~]# curl -I -H'HOST: py.test.com' 172.16.1.7
HTTP/1.1 200 OK
Server: nginx/1.20.2
[root@web01 ~]# curl -I -H'HOST: py1.test.com' 172.16.1.7
HTTP/1.1 200 OK
Server: nginx/1.20.2
# 9.压力测试uwsgi
[root@web01 ~]# ab -n 10000 -c 10 http://py.test.com/
Concurrency Level:      10
Time taken for tests:   62.984 seconds  # 花了62秒
Complete requests:      10000
Failed requests:        0
# 10压力测试python直接启动
[root@web01 ~]# ab -n 10000 -c 10 http://py.test.com/
Concurrency Level:      10
Time taken for tests:   100.493 seconds  # 花了100秒
Complete requests:      10000
Failed requests:        0

4.部署bbs项目

bbs项目需要使用数据库,打开db01主机.
4.1MySQL/MariaDB数据库介绍
MySQL创立于1996年,最初属于mysql AB公司,在2008116号被sun收购,
随后,MySQL的创始人Monty Widenius向Sun提交了辞呈.
sun在2009年被oracle收购.
oracle收购了MySQL后,有将MySQL闭源的潜在风险,
MySQL之父 Michael Widenius写了新的项目MariaDB

过去一年中,大型互联网用户以及Linux发行商纷纷抛弃MySQL,转投MariaDB阵营。MariaDB是目前最受关注的MySQL数据库衍生版,也被视为开源数据库MySQL的替代品。
版本方面,MariaDB直至5.5版本,均沿袭MySQL的版本。故此,使役MariaDB5.5的人会从MySQL 5.5中理解到MariaDB的所有功能。从20121112日起发布的10.0.0版起始,不再沿袭MySQL的版号。10.0.x版以5.5版为基础,加上移植自MySQL 5.6版的功能和自行开发的新功能。
4.2下载数据库&Pycharm连接
# 1.下载数据库
[root@db01 ~]#  yum install mariadb* -y
# 2.启动数据库服务
[root@db01 ~]# systemctl start mariadb 
# 3.启动数据库
[root@db01 ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
...
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
# 4.创建用户
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
# 5.创建数据库 名称为bbs
MariaDB [(none)]> CREATE DATABASE `bbs` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Query OK, 1 row affected (0.00 sec)
 CREATE DATABASE `bbs` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
# 退出mysql
MariaDB [(none)]> exit
Bye

# 6.重启数据库  
[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql
# 7.Python远程连接数据库

image-20220107111521720

image-20220107111621067

image-20220107115645452

image-20220107115450994

image-20220107115721831

4.3部署
# 1.上传代码
[root@web01 ~]# rz -E
# 2.解压
[root@web01 ~]# unzip bbs.zip
# 3.移动到/opt/目录下
[root@web01 ~]# mv bbs /opt/
# 4.删除数据库缓存
[root@web01 ~]# cd /opt/bbs/app01/migrations
[root@web01 migrations]# ll
total 32
-rw-r--r-- 1 root root 11783 Dec 14 19:02 0001_initial.py
-rw-r--r-- 1 root root   526 Dec 14 19:25 0002_auto_20211214_1925.py
-rw-r--r-- 1 root root   537 Dec 14 19:33 0003_auto_20211214_1933.py
-rw-r--r-- 1 root root   620 Dec 15 19:33 0004_auto_20211215_1933.py
-rw-r--r-- 1 root root   464 Dec 15 19:35 0005_auto_20211215_1935.py
-rw-r--r-- 1 root root   503 Dec 17 08:44 0006_auto_20211217_0844.py
-rw-r--r-- 1 root root     0 Dec  9 20:07 __init__.py  # 只保存这个其他的都删了
[root@web01 migrations]# rm -rf 00*
[root@web01 migrations]# rm -rf __pycache__/
[root@web01 migrations]# ll
-rw-r--r-- 1 root root 0 Dec  9 20:07 __init__.py

image-20220107121128467

代码是用django1.11.1版本写的
# 5.查看版本
[root@web01 migrations]# pip3 list
...
Django (3.2.11)
# 6.修改Django版本
[root@web01 migrations]# pip3 uninstall -y django
[root@web01 migrations]# pip3 install django==1.11.1
# 7.安装Python连接数据库的插件
[root@web01 migrations]# pip3 install pymysql
# 8.修改配置文件
[root@web01 bbs]# vim /opt/bbs/bbs/settings.py
27 行 设置所有ip可以访问
ALLOWED_HOSTS = ['*']
74 行设置数据库 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'bbs',
        'USER': 'root',
        'PASSWORD': '123',
        'HOST': '172.16.1.61',
        'PORT': 3306,
        'CHARSET': 'utf8'
    }

# 9.创建数据库迁移文件
[root@web01 bbs]# cd /opt/bbs
[root@web01 bbs]# python3 manage.py makemigrations
[root@web01 bbs]# python3 manage.py migrate
使用pycharm查看一下,创建的表

image-20220107123809292

# 10.配置UWSGI
[root@web01 bbs]# pwd
/opt/bbs
[root@web01 bbs]# ll
total 8
drwxr-xr-x 4 root root 163 Dec 17 15:30 app01
drwxr-xr-x 3 root root  93 Jan  7 12:33 bbs
-rw-r--r-- 1 root root 823 Dec  9 20:07 manage.py
drwxr-xr-x 6 root root  57 Dec 16 15:55 static
drwxr-xr-x 2 root root 111 Dec 17 17:12 templates

[root@localhost ~]# vi /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

[root@web01 bbs]# ll
total 8
drwxr-xr-x 4 root root 163 Dec 17 15:30 app01
drwxr-xr-x 3 root root  93 Jan  7 12:33 bbs
-rw-r--r-- 1 root root 823 Dec  9 20:07 manage.py
-rw-r--r-- 1 root root 345 Jan  7 12:40 myweb_uwsgi.ini  # 多了这个配置文件
drwxr-xr-x 6 root root  57 Dec 16 15:55 static
# 11.启动 uwsgi
uwsgi -d --ini myweb_uwsgi.ini --uid 666
# 12.配置Nginx
[root@web01 bbs]#  vi /etc/nginx/conf.d/python.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;
    }
}
# 13.检查配置重启nginx 
[root@web01 bbs]# 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 bbs]# systemctl restart nginx 
# 14.DNS解析
C:\Windows\System32\drivers\etc\hosts
172.16.1.7 bbs.test.com

image-20220107124651824

15.测试 访问成功

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值