LNMP
搭建LNMP
动态网站:在不同环境下访问,网站环境又可能变化
静态网站:在不同环境下访问,网站环境不会变化
【1】、搭建LNMP
L:Linux
N:nginx
M:Mariadb/Mysql
P:PHP/Python
LNMP:也被称为动静分离
# 安装nginx
root@proxy[05:08:54]:/opt/nginx-1.24.0
$ ./configure && make && make install
# 安装数据库
yum install -y mariadb mariadb-server mariadb-devel
# 安装php
yum install -y php php-mysqlnd php-fpm
# php-mysqlnd:php控制数据库的软件
# php-fpm:nginx默认是不会解析动态网站的,php-fpm可以解析index.php动态网站
分别启动nginx、mariadb、php-fpm
# 启动nginx
/usr/local/sbin/nignx
ss -tunlp | grep nginx
# 启动mariadb
systemctl restart mariadb
systemctl enable mariadb
ss -tunpl | grep mysql
# 启动php-fpm,php-fpm默认是不开启端口的
systemctl restart php-fpm
systemctl enable php-fpm
ps -ef | grep php-fpm
【2】、nginx连接php-fpm
1、网络连接方式
但是此时nginx还是不能去解析php编写的动态网站,因为php还没有和nginx结合,当nginx收到了一个动态网站时,nginx并不知道要去找php-fpm去解析动态网站,我们需要让php-fpm提供一个接口,能够让nginx需要时去找到php-fpm
先修改php-fpm的配置文件
/etc/php-fpm.d/www.conf
在其中将原来的listen注释掉,新增一个listen
listen = 127.0.0.1:9000
重启php-fpm
systemctl restart php-fpm
root@proxy[16:30:54]:~
$ systemctl restart php-fpm
root@proxy[16:31:03]:~
$ ss -tunlp | grep 9000
tcp LISTEN 0 511 127.0.0.1:9000 0.0.0.0:* users:(("php-fpm",pid=2120,fd=8),("php-fpm",pid=2119,fd=8),("php-fpm",pid=2118,fd=8),("php-fpm",pid=2117,fd=8),("php-fpm",pid=2116,fd=8),("php-fpm",pid=2113,fd=6))
然后再通知给nginx,当你需要解析动态网站时,可以去找9000端口。这一部分配置同样不需要自己去写,nginx作者为我们写好了。我们只需将注释取消即可。再将include后面的内容修改为fastcgi.conf
location在nginx配置文件中是“如果”的意思,location表示匹配,后面跟的是路径。具体含义是:如果匹配到后面的内容则执行下面的语句。如果location后面有“~”,则代表后面跟的是正则
修改完成后,重启nginx
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
上述的连接方式是属于网络连接,当访问量巨大时,nginx和php-fpm可以放在两台机器上
2、socket接口连接
直接连接,进程间通讯
socket(接口)文件只能在一台服务器上通讯
- 首先修改php-fpm的配置文件
- 将之前的listen 127.0.0.1:9000注释
- 将上一行的listen /run/php-fpm/www.sock释放
- 这个文件就是socket文件,这是一个接口文件s,他还设置了ACL权限
- 我们要修改nginx的acl_user,(如果你的nginx用户是nginx,那就不用修改了)。
- nginx的acl_user默认只有apache和nginx,我们需要加上nobody,在配置文件中修改
- listen.acl_users = apache,nginx,nobody
- 修改nginx的配置文件
- 将之前的fastcgi_pass 127.0.0.1:9000注释
- 在下面新增
fastcgi_pass unix:/run/php-fpm/www.sock
- 重启nginx
root@proxy[17:26:17]:/usr/local/nginx
$ ls -l /run/php-fpm/www.sock
srw-rw----+ 1 root root 0 Jun 19 17:25 /run/php-fpm/www.sock
root@proxy[17:26:44]:/usr/local/nginx
$ getfacl /run/php-fpm/www.sock
getfacl: Removing leading '/' from absolute path names
# file: run/php-fpm/www.sock
# owner: root
# group: root
user::rw-
user:apache:rw-
user:nginx:rw-
group::rw-
mask::rw-
other::---
# ACL权限允许apache和nginx,我们需要允许nobody用户经过,去修改php-fpm的配置文件
root@proxy[17:30:52]:/usr/local/nginx
$ getfacl /run/php-fpm/www.sock
getfacl: Removing leading '/' from absolute path names
# file: run/php-fpm/www.sock
# owner: root
# group: root
user::rw-
user:apache:rw-
user:nginx:rw-
user:nobody:rw-
group::rw-
mask::rw-
other::---
【3】、fastcgi
当客户经过nginx访问动态网站时,如果访问量特别大时,nginx是可以忙过来的,但是在nginx解析动态网站时是需要依靠php-fpm的帮助。当访问量巨大时,nginx可以忙过来但是php-fpm不行。
因此php-fpm就需要多开几个进程去配合nginx使用,php-fpm开的进程就叫fastcgi。
php-fpm默认开5个fastcgi,默认最多开50个fastcgi。如果当前个数的fastcgi不够用,php-fpm会自己主动开放新的fastcgi,这些可以在php-fpm配置文件中进行修改,这个fastcgi理论上可以开无数个,但是这个东西很耗内存,每开一个大概消耗25M的内存
# 在php-fpm配置文件中
# 最大个数
pm.max_children = 50
# 默认开放个数
pm.start_servers = 5
pstree | grep php-fpm
|-php-fpm---5*[php-fpm]
【4】、地址重写
html为网站默认的根
在实际生产中我们不能把所有的文件都放在html中
一般来说我们会在html中创建目录:html/project-A/type-1/abc.html
但是这样的话,客户去访问abc.html就极其困难了,需要输入的地址很长
地址重写语法:(可以写多个)
rewrite 旧地址(可以不存在) 新地址(实际存在)
rewire /abc.html /project-A/type-1/abc.html redirect
rewire /xxx.html /project-B/type-2/red/xxx.html
在旧地址的位置是支持正则表达式的
rewrite表示我写的路径中包含a.html就会跳转到新地址中,例如我写a.htmlqwqeqwe也会跳转到新地址中,我写asda.html也会跳到新地址中。
因此我们就需要正则去限制^/a\.html$,只有这样才能保证我们只能输入a.html才能跳到新的地址中
redirect参数:在浏览器访问时,我们输入了旧地址,他会自己更新为新的地址
不同网站之间地址重写:主要用在新老网站交替时使用
当访问任意网站时,都会跳转到http://www.baidu.com
rewrite / http://www.baidu.com;
当访问任意网站时,都会跳转到相对应的网页
rewrite /(.*) http://www.baidu.com/$1;
针对不同的浏览器会有不同的显示
也可以通过地址重写实现
$http_user_agent:是nginx的内置变量
~*:表示匹配正则,且忽略大小写
当我们访问Firefox浏览器的时候,会跳转到firefox的网页中,我们访问其他浏览器的时候会访问另外一个html
if ($http_user_agent ~* firefox){
rewrite (.*) /firefox/$1;
}
1、redirect
临时重定向
状态码 302
针对爬虫的影响不同:爬虫不更新URI
2、permanent
永久重定向
状态码 301
针对爬虫的影响不同:爬虫更新URI
3、last
如果地址重写,像下面这样写,那么我访问a.html会直接访问c.html
rewrite /a.html /b.html;
rewrite /b.html /c.html;
因此我们需要加上last,此时访问a.html会跳到b.html,不会直接跳到c.html
rewrite /a.html /b.html last;
rewrite /b.html /c.html;
last会阻止后续语句,还会继续匹配location
location / {
root html;
rewrite /a.html /b.html last;
index index.html index.htm;
}
location /b.html{
rewrite /b.html /c.html;
}
4、break
不再执行其他语序,结束请求
location / {
root html;
rewrite /a.html /b.html break;
index index.html index.htm;
}
location /b.html{
rewrite /b.html /c.html;
}
【5】、状态码
200:一切正常
301:永久重定向
302:临时重定向
400:请求语法错误
401:访问被拒绝
403:禁止访问
404:资源找不到
414:请求的URL太长
500:服务器内部错误
502:代理服务器无法正常获取下一个服务器正常的应答
搭建集群
正向代理:给客户提供服务,例如:加速器
反向代理:帮助服务器分担流量,负责后台业务,例如:nginx
轮询:假设有三台web服务器,轮询就是123123123的去分发任务
权重:默认是1,权重越大的服务器分到的任务越多
加权轮询:不再是123123123的轮询了,而是权重大的给分的多112311231123
健康检查:代理服务器向后台服务器分配任务时要进行安全检查,在分任务。检测一次web服务器没有响应就认为是挂了,每隔10s再检测一次
优化检测次数和间隔时间
【1】、规划集群
nginx作为代理服务器,起到负载均衡的作用,将从客户端发来的流量做分流,采用轮询的方式分发到后面的服务器,可以有效地提高网站的可靠性和稳定性。
本次实验我们使用一台nginx做负载均衡,两台web服务器
nginx:192.168.121.170
web01:192.168.121.171(httpd)
web02:192.168.121.172(httpd)
【2】、具体配置
具体配置:
web01和web02只需安装好apache,写好网页文件即可
nginx服务器:
安装好nginx后,设置集群
- upstream:表示定义一个集群
- webserver:集群名字
- proxy_pass:表示启用集群
设置权重
- 再定义集群时,加上weight参数
设置健康检查参数
- 再定义集群时,加上max_fails(检查次数) fail_timeout(失败超时时间)参数
ip_hash:能够改变集群在调度服务器的工作状态,根据客户地址的前三位,基于内部算法计算出,这个IP交给哪一台web服务器负责,以后nginx再收到来自之这个IP的请求就自动转发到对应的那台web服务器上
这个配置主要是用于需要登录的网站
down:将web服务器中的某一台主机临时下线,可以在服务器不关机的情况下,不给设置了down标记的服务器分配任务
# 再nginx配置文件中的http大括号中添加:
upstream webserver{
server 192.168.121.171:80;
server 192.168.121.172:80;
}
# 再loaction中添加
proxy_pass http://webserver
# 设置权重
upstream webserver{
server 192.168.121.171:80 weight=2;
server 192.168.121.172:80;
}
# 健康检查
upstream webserver{
server 192.168.121.171:80 weight=2;
server 192.168.121.172:80 max_fails=2 fail_timeout=30;
}
# 配置ip_hsah
upstream webserver{
ip_hash;
server 192.168.121.171:80;
server 192.168.121.172:80;
}
# 配置down
upstream webserver{
server 192.168.121.171:80 down;
server 192.168.121.172:80;
}
【3】、查看网址后台数据
nginx支持查看后台数据,我们需要先增加支持后台数据的模块
若果我们想增加一个模块,不用把nginx卸载掉重装,只需重新编译即可
cd /opt/nginx-1.24.0/
# 重新编译时,我们需要带上要增加的模块,和他之前自带的模块,如果没有带之前自带的模块,则认为是删除之前的模块
./configure --with-stream --with-http_stub_status_module && make
# 再重新编译好后,此时/usr/local/nginx/sbin/中的nginx主程序还没有变化,我们需要将/opt/nginx-1.24.0/objs/nginx复制到/usr/local/nginx/sbin/中,将原本的nginx主程序替换掉
cp /opt/nginx-1.24.0/objs/nginx /usr/local/nginx/sbin/
/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.24.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-20) (GCC)
configure arguments: --with-stream --with-http_stub_status_module
然后修改配置文件,添加后台数据模块
# allow和deny设置谁可以访问,谁不能访问,不能使用真机的浏览器去访问了,可以使用允许的IP的curl访问
location /status {
stub_status on;
allow 192.168.121.170;
deny all;
}
Active connections:当前活动的连接数量
Accepts:已经接收客户端连接的总数量
Handled:已经处理客户端的连接总数量
Requests:客户端发送请求的数量
Reading:当前服务器正在读取客户端请求头的数量(当前服务器正在看几个人的请求)
Writing:当前服务器正在写响应信息的数量(给几个人响应消息)
Waiting:有几个客户端在等待响应
本文来自博客园,作者:Linux小菜鸟,转载请注明原文链接:https://www.cnblogs.com/xuruizhao/p/18316252