nginx实现web架构
目录
nginx实现web架构
location优先级
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配 | 1 |
^~ | 以某个字符串开头 | 2 |
~ | 区分大小写的正则匹配 | 3 |
~* | 不区分大小写的正则匹配 | 4 |
!~ | 区分大小写不匹配的正则 | 5 |
!~* | 不区分大小写不匹配的正则 | 6 |
/ | 通用匹配,任何请求都会匹配到 | 7 |
应用场景
# 通用匹配,任何请求都会匹配到
location / {
...
}
# 严格区分大小写,匹配以.php结尾的都走这个location
location ~ \.php$ {
...
}
# 严格区分大小写,匹配以.jsp结尾的都走这个location
location ~ \.jsp$ {
...
}
# 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
location ~* .*\.(jpg|gif|png|js|css)$ {
...
}
location ~* \.(jpg|gif|png|js|css)$ {
...
}
# 不区分大小写匹配
location ~* "\.(sql|bak|tgz|tar.gz|.git)$" {
...
}
企业中网站架构
#企业常规架构
LNMP:Linux Nginx MySQL PHP
LAMP:Linux Apache MySQL PHP
LNMT:Linux Nginx MySQL Tomcat
LAMT:Linux Apache MySQL Tomcat
Nginx
Apache
#运行前端代码:html css js
PHP:运行php代码
Tomcat:运行Java代码
#运行后端代码
LNMP架构如何工作的
首先Nginx服务是不能处理动态请求,那么当用户发起动态请求时, Nginx又是如何进行处理的。
当用户发起http请求,请求会被Nginx处理,如果是静态资源请求Nginx则直接返回,如果是动态请求Nginx则通过fastcgi协议转交给后端的PHP程序处理。
Nginx与Fast-CGO详细工作流程
1.用户通过http
协议发起请求,请求会先抵达LNMP
架构中的Nginx
2.Nginx
会根据用户的请求进行判断,这个判断是有Location
进行完成
3.判断用户请求的是静态页面,Nginx
直接进行处理
4.判断用户请求的是动态页面,Nginx
会将该请求交给fastcgi
协议下发
5.fastgi
会将请求交给php-fpm
管理进程, php-fpm
管理进程接收到后会调用具体的工作进程warrap
6.warrap
进程会调用php
程序进行解析,如果只是解析代码php
直接返回
7.如果有查询数据库操作,则由php
连接数据库(用户 密码 IP)发起查询的操作
8.最终数据由*mysql->php->php-fpm->fastcgi->nginx->http->user
部署PHP
# 1.卸载Linux自带的旧版本php
[root@web01 ~]# yum remove php-mysql-5.4 php php-fpm php-common
# 2.添加php第三方源
[root@nginx ~]# vim /etc/yum.repos.d/php.repo
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
# 3.安装php
[root@web01 ~]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm
php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
# 4.创建用户
[root@web01 ~]# groupadd www -g 666
[root@web01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
# 5.修改nginx运行用户
[root@web01 ~]# vim /etc/nginx/nginx.conf
user www;
php-fpm作用:用来管理php程序运行
## php相关配置文件
/etc/php-fpm.conf # php管理进程配置文件
/etc/php.ini # php程序配置文件
/etc/php-fpm.d/www.conf # php管理进程的子配置文件
# 6.修改php的启动用户
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
[www]
user = www
group = www
# 7.启动php并加入开机自启
[root@web01 ~]# systemctl start php-fpm
[root@web01 ~]# systemctl enable php-fpm
# 8.检查php进程和端口
[root@web01 ~]# ps -ef|grep php
root 18384 1 0 19:44 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
www 18385 18384 0 19:44 ? 00:00:00 php-fpm: pool www
www 18386 18384 0 19:44 ? 00:00:00 php-fpm: pool www
www 18387 18384 0 19:44 ? 00:00:00 php-fpm: pool www
www 18388 18384 0 19:44 ? 00:00:00 php-fpm: pool www
www 18389 18384 0 19:44 ? 00:00:00 php-fpm: pool www
root 18414 7036 0 19:45 pts/0 00:00:00 grep --color=auto php
[root@web01 ~]# netstat -lntup|grep php
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
18384/php-fpm: mast
配置nginx连接php
[root@web01 movie]# vim /etc/nginx/conf.d/movie.conf
server{
listen 80;
server_name movie.lw.com;
location /{
root /movie;
index index.php index.html;
}
location ~ \.php$ {
root /movie;
## nginx调用本机的9000端口(php-fpm程序)
fastcgi_pass 127.0.0.1:9000;
## 用php程序,解析哪个目录下的哪个.php的文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
## 包含php变量的文件
include /etc/nginx/fastcgi_params;
}
}
部署wordpress
# 1.编辑nginx配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/blog.lw.com.conf
server{
listen 80;
server_name blog.lw.com;
location /{
root /blog;
index index.php index.html;
}
location ~ \.php$ {
root /blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
# 2 重新加载nginx
[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
[root@web01 conf.d]# systemctl reload nginx
# 3.创建站点目录并授权
[root@web01 ~]# mkdir /blog/wordpress
[root@web01 wordpress]# chown -R www.www /blog/wordpress/
# 4.测试nginx连接php(编写php info代码)
[root@web01 ~]# vim /blog/info.php
<?php
phpinfo();
?>
# 5.windows域名解析
打开路径:C:\Windows\System32\drivers\etc 编辑hosts文件
10.0.0.7 blog.lw.com
# 6.打开浏览器访问:http://blog.lw.com/info.php
# 7.下载wordpress代码
wordpress官网:https://wordpress.org/
[root@web01 blog]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
# 8.解压代码
[root@web01 blog]# tar xf latest-zh_CN.tar.gz
# 9.修改nginx配置文件
[root@web01 blog]# vim /etc/nginx/conf.d/blog.lw.com.conf
server{
listen 80;
server_name blog.lw.com;
root /blog/wordpress;
location /{
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
#10.重新加载nginx
[root@web01 blog]# 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 blog]# systemctl reload nginx
# 11.打开浏览器,访问:http://blog.lw.com/
安装数据库
## 数据库是C/S结构
## 默认端口:3306
# 1.安装mariadb
[root@web01 ~]# yum install -y mariadb-server
# 2.启动数据库并加入开机自启
[root@web01 ~]# systemctl start mariadb
[root@web01 ~]# systemctl enable mariadb
# 3.登录数据库
[root@web01 ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.68-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
# 4.查看所有库
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
# 5.切换数据库
MariaDB [(none)]> use mysql
# 6.查看该库中的所有表
MariaDB [mysql]> show tables;
# 7.创建数据库
MariaDB [mysql]> create database 库名字;
MariaDB [mysql]> create database wordpress;
# 8.创建用户
MariaDB [(none)]> grant all on 所有库.所有表 to 用户名@'主机IP' identified by '密码';
MariaDB [(none)]> grant all on *.* to wp@'localhost' identified by '123';
# 9.查看用户
MariaDB [(none)]> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| wp | localhost |
| | web01 |
| root | web01 |
+------+-----------+
# 10.退出数据库
MariaDB [(none)]> exit
MariaDB [(none)]> quit
MariaDB [(none)]> \q
数据库名字:wordpress
连接用户名:wp
连接密码:123
连接IP:localhost
鼠标样式
vim header.php
<script type="text/javascript">
/* 鼠标特效 */
$(function() {
var a_idx = 0,
b_idx = 0;
c_idx = 0;
jQuery(document).ready(function($) {
$("body").click(function(e) {
var a = new Array("苍井空", "武藤兰", "小泽玛利亚","泷泽萝拉", "波多野结衣", "吉泽 明步", "西野翔", "饭岛爱", "天海翼", "邱老师" ,"麻生希", "绫濑遥", "滨崎步", "黑木瞳", "由加 奈"),
b = new Array("#09ebfc", "#ff6651", "#ffb351", "#51ff65", "#5197ff", "#a551ff", "#ff51f7", "#ff518e", "#ff5163", "#efff51"),
c = new Array("12", "14", "16", "18", "20", "22", "24", "26", "28", "30");
var $i = $("<span/>").text(a[a_idx]);
a_idx = (a_idx + 1) % a.length;
b_idx = (b_idx + 1) % b.length;
c_idx = (c_idx + 1) % c.length;
var x = e.pageX,
y = e.pageY;
$i.css({
"z-index": 999,
"top": y - 20,
"left": x,
"position": "absolute",
"font-weight": "bold",
"font-size": c[c_idx] + "px",
"color": b[b_idx]
});
$("body").append($i);
$i.animate({
"top": y - 180,
"opacity": 0
}, 1500, function() {
$i.remove();
});
});
});
var _hmt = _hmt || [];
})
</script>
优化nginx上传大小
# 在http层添加配置
[root@web01 QQ2.8]# vim /etc/nginx/nginx.conf
client_max_body_size 8m;
Web集群数据拆分及共享存储
拆分数据库至独立服务器
为什么要进行服务器拆分:
- 由于单台服务器运行
LNMP
架构会导致网站访问缓慢,当内存被占满时,很容易导致系统出现oom
从而kill掉MySQL数据库,所以要将web和数据库进行独立部- 缓解web网站的压力
- 增强数据库读写性能
- 提高用户访问速度
环境准备
主机名 | WanIP | LanIP | 角色 | 安装应用 |
---|---|---|---|---|
web01 | 10.0.0.7 | 172.16.1.7 | web网站 | nginx php |
db01 | 10.0.0.51 | 172.16.1.51 | 数据库 | MySQL(mariadb) |
旧数据库操作
#1.wp库数据备份
[root@web01 ~]# mysqldump -u用户名 -p密码 -B 库名字 > /tmp/wp.sql
[root@web01 ~]# mysqldump -uroot -p -B wp > /tmp/wp.sql
# 2.将备份好的数据拷贝到新数据库服务器中
[root@web01 ~]# scp /tmp/wp.sql root@172.16.1.51:/tmp/
# 3.在下面新数据库操作做完之后,停掉旧数据库
[root@web01 ~]# systemctl stop mariadb
新数据库操作
# 1.安装数据库
[root@db01 ~]# yum install -y mariadb-server
# 2.启动数据库并加入开机自启
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# systemctl enable mariadb
3.给MySQL的root用户设置密码
[root@db01 ~]# mysqladmin -uroot -p password '123'
Enter password: # 如果没有密码则直接回车,如果有密码就输入旧密码
# 4.导入数据
[root@db01 ~]# mysql -uroot -p123 < /tmp/wp.sql
# 5.检查是否导入成功
[root@db01 ~]# mysql -uroot -p123
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wp |
+--------------------+
# 6.创建用户
MariaDB [(none)]> grant all on *.* to wp_user@'%' identified by '123';
#授权所有权限 grant all privileges
#授权所有库所有表 *.*
#将授权赋予给哪个用户,这个用户只能通过哪个网段过来(%所有) 'all'@'%'
#授权该用户登录的密码 identified by
# 7.测试web01是否可以远程连接db01的MySQL
[root@web01 ~]# mysql -uwp_user -p123 -h10.0.0.51
# 8.修改wordpress连接数据库的配置
[root@web01 wordpress]# vim /blog/wordpress/wp-config.php
define( 'DB_NAME', 'wp' );
/** Database username */
define( 'DB_USER', 'wp_user' );
/** Database password */
define( 'DB_PASSWORD', '123' );
/** Database hostname */
define( 'DB_HOST', '10.0.0.51' )
多台相同的Web服务器
为什么要扩展多台web节点
- 单台web服务器能抗住的访问量是有限的,配置多台web服务器能提升更高的访问速度
- 单台web节点如果故障,会导致业务down机
- 多台web节点能保证业务的持续稳定,扩展性高
- 多台web节点能有效的提升用户访问网站的速度
- 多台web节点技术架构组成,如下图所示
环境准备
主机名称 | 应用环境 | 外网地址 | 内网地址 | 角色 |
---|---|---|---|---|
web01 | nginx+php | 10.0.0.7 | 172.16.1.7 | web网站 |
web02 | nginx+php | 10.0.0.8 | 172.16.1.8 | web网站 |
db01 | mysql(mariadb) | 10.0.0.51 | 172.16.1.51 | 数据库 |
部署web02
# 1.添加yum源
[root@web01 yum.repos.d]# scp /etc/yum.repos.d/nginx.repo /etc/yum.repos.d/php.repo
172.16.1.8:/etc/yum.repos.d/
# 2.创建www用户和组
[root@web02 ~]# groupadd www -g 666
[root@web02 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
# 3.安装nginx和php
[root@web02 ~]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm
php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb nginx mariadb-server
# 4.添加nginx虚拟主机配置文件
[root@web02 ~]# vim /etc/nginx/conf.d/blog.lw.com.conf
server{
listen 80;
server_name www.lw.com;
root /blog/wordpress;
index index.php index.html;
location ~ \.php$ {
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/opt/php.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 5.修改nginx启动用户
[root@web02 ~]# vim /etc/nginx/nginx.conf
user www;
# 6.修改php启动用户
[root@web02 ~]# vim /etc/php-fpm.d/www.conf
[www]
user = www
group = www
;listen = 127.0.0.1:9000
listen = /opt/php.sock
listen.owner = www
listen.group = www
# 7.创建站点目录
[root@web02 ~]# mkdir /blog
############ 8.下载wordpress代码
[root@web02 ~]# cd /blog/
[root@web02 blog]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
############ 9.解压wordpress
[root@web02 blog]# tar xf latest-zh_CN.tar.gz
# 8.拷贝web01代码到web02上
[root@web01 php]# scp -r /blog/wordpress/ 172.16.1.8:/blog
# 9.授权
[root@web02 blog]# chown -R www.www /blog/
# 10.启动nginx和php
[root@web02 blog]# systemctl start nginx php-fpm
# 11.域名解析到web02
10.0.0.8 www.lw.com
拆分静态资源至独立服务器
为什么拆分拆分静态资源至独立服务器
- 当后端的
web
节点出现多台时,会导致用户上传的图片、视频附件等内容仅上传至一台web
服务器,那么其他的web服务器则无法访问到该图片- 保证了多台web节点静态资源一致。
- 有效节省多台web节点的存储空间。
- 统一管理静态资源,便于后期推送至CDN进行静态资源加速
环境准备
主机名称 | 应用环境 | 外网地址 | 内网地址 | 角色 |
---|---|---|---|---|
web01 | nginx+php | 10.0.0.7 | 172.16.1.7 | web网站、共享存储客户端 |
web02 | nginx+php | 10.0.0.8 | 172.16.1.8 | web网站、共享存储客户端 |
nfs | nfs | 10.0.0.31 | 172.16.1.31 | 共享存储服务端 |
db01 | mysql | 10.0.0.51 | 172.16.1.5 | 数据库 |
部署nfs服务端
# 1.安装nfs服务
[root@nfs ~]# yum install -y nfs-utils
# 2.修改nfs配置文件
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,anonuid=666,anongid=666,all_squash)
#3.创建共享存储目录
[root@nfs ~]# mkdir /data
# 4.创建www用户和组
[root@nfs ~]# groupadd www -g 666
[root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
# 5.授权共享存储目录
[root@nfs ~]# chown www.www /data
# 6.启动服务并加入开机自启
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl enable nfs
# 7.检查nfs配置文件是否生效
[root@nfs ~]# cat /var/lib/nfs/etab
nfs客户端操作
# 1.安装nfs服务
[root@web01 ~]# yum install -y nfs-utils
[root@web02 ~]# yum install -y nfs-utils
# 2.查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31
[root@web02 ~]# showmount -e 172.16.1.31
# 3.拷贝已有数据到共享目录
[root@web01 ~]# scp -r /blog/wordpress/wp-content/uploads/2022 172.16.1.31:/data
[root@web02 ~]# scp -r /blog/wordpress/wp-content/uploads/2022 172.16.1.31:/data
# 4.给nfs的/data目录授权
[root@nfs ~]# chown -R www.www /data
# 5.挂载
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /blog/wordpress/wp-content/uploads/
[root@web02 ~]# mount -t nfs 172.16.1.31:/data /blog/wordpress/wp-content/uploads/