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

image-20240619091900235

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:代理服务器无法正常获取下一个服务器正常的应答

搭建集群

image-20240620083011286

正向代理:给客户提供服务,例如:加速器

反向代理:帮助服务器分担流量,负责后台业务,例如: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服务器:

  1. 安装好nginx后,设置集群

    1. upstream:表示定义一个集群
    2. webserver:集群名字
    3. proxy_pass:表示启用集群
  2. 设置权重

    1. 再定义集群时,加上weight参数
  3. 设置健康检查参数

    1. 再定义集群时,加上max_fails(检查次数) fail_timeout(失败超时时间)参数
  4. ip_hash:能够改变集群在调度服务器的工作状态,根据客户地址的前三位,基于内部算法计算出,这个IP交给哪一台web服务器负责,以后nginx再收到来自之这个IP的请求就自动转发到对应的那台web服务器上

    这个配置主要是用于需要登录的网站

  5. 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:有几个客户端在等待响应

posted @ 2024-07-22 16:15  Linux小菜鸟  阅读(9)  评论(0编辑  收藏  举报