文章目录
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/
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 =";
}
}
2.级别2
删除 location = /python {...}
nginx -t
systemctl restart nginx
3.级别3
删除 location ^~ /python { ... }
nginx -t
systemctl restart nginx
4.级别4
删除 location ~* /python { ... }
nginx -t
systemctl restart nginx
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/
现在存在的缓存文件,清空缓存,再刷新就没有了
# 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.测试成功!
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
# 5.创建目录
[root@web02 ~]# mkdir /opt/Super_Marie
[root@web02 ~]#cd /opt/Super_Marie
把文件拖进去,忽略 images
images文件夹也无法拖的
# 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/
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 = {
}
# 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
13.测试访问
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.
# 监听状态
# 使用 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
# 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公司,在2008年1月16号被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的所有功能。从2012年11月12日起发布的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远程连接数据库
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
代码是用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查看一下,创建的表
# 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
15.测试 访问成功