LNMP架构之web服务器实战

LNMP架构

1.nginx部署

systemctl disable --now keepalived.service

关闭keepalived服务,避免冲突

将下载好的nginx软件压缩包直接拖入mobaxterm目录即可

tar zxf nginx-1.23.3.tar.gz

cd nginx-1.23.3/

yum install -y gcc pcre-devel openssl-devel

#安装依赖性

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module

#源码安装

make

#编译

make clean

#想要重新编译,先清除掉Makefiles和abjs

vim auto/cc/gcc

调试模式适用于开发者,关闭后编译生成的二进制程序比较精简

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module

#再次安装

make install

#将编译好的程序安装到系统指定路径

systemd site:www.nginx.com

#指定到官网搜索

vim /usr/lib/systemd/system/nginx.service

二进制程序启动和脚本启动勿混用,可能会导致服务异常

systemctl daemon-reload

#重载后安装完成


2.nginx平滑升级

下载软件:nginx: downloadicon-default.png?t=N7T8https://nginx.org/en/download.html

要实现在线升级,升级过程中服务不会中断

tar zxf nginx-1.25.3.tar.gz

cd nginx-1.25.3

vim auto/cc/gcc

#修改gcc

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module

#执行与原来相同的命令,静态编译需与原来版本参数类型相同

make

此时切忌执行make install

因为原来程序正在运行,会直接覆盖掉原来的程序

拷贝新程序

\cp -f nginx /usr/local/nginx/sbin/

#  \转译

ps ax|grep nginx

#获取nginx进程id

master会监控worker的健康状态,对外接受80端口请求,并且负载到worker

worker数一般和cpu核心数相同,worker数量越多,nginx处理的并发数越多

kill -WINCH 7268

3.版本回退

拷贝原程序:

cd /usr/local/nginx/sbin/

\cp -f nginx.old nginx

唤醒原版本:

kill -HUP 7268

回收新版本:

kill -WINCH 7577

整个过程中未出现服务不可用情况


反向代理负载均衡

正向代理即客户端代理,代理客户端,服务端不知道实际发起请求的客户端。

反向代理即服务端代理,代理服务端,客户端不知道实际提供服务的服务端。

1.修改nginx服务启动用户 

useradd -M -d /usr/local/nginx/ -s /sbin/nologin nginx

vim nginx.conf

nginx -s reload

#重载

ps axu | grep nginx

2.nginx进程与cpu核心绑定

nginx -s reload

此方法有可能导致worker进程负载不均衡

vim nginx.conf

nginx -s reload

3.修改nginx并发连接数

vim nginx.conf 

kernel > system > app

#内核的优先级高于操作系统,再高于应用

修改系统限制:

vim /etc/security/limits.conf

内核参数是根据本机物理资源自动配置的,一般不需要修改

负载均衡设置

文档:

vim nginx.conf

保存退出

nginx -s reload

用192.168.145.14访问

因为服务自带健康检测,配置文件中写的是8080,server3并未监听8080端口

server3:

vim /etc/httpd/conf/httpd.conf

#编辑apache配置文件

systemctl restart httpd

#重启服务

server4:

访问11的80端口,可以调度到13的8080端口,改变了访问目标的端口

client -> nginx -> RS -> nginx -> client

原路径返回,客户端只知道有nginx,看不到RS的存在

nginx作反向代理,客户端并不会直接访问RS,是由nginx访问后端,再返回交给客户端,所以nginx真正并发连接量应该是并发连接数除以二

nginx对后端带有健康检测

关闭server2httpd服务

如果server3也挂掉

server1:

yum install -y httpd

#安装httpd

vim /etc/http/conf/httpd.conf

systemctl start httpd

#启动软件

nginx和httpd各自占用各自端口,不冲突

vim nginx.conf

nginx -s reload

此时再次访问:

只要有后端RS正常,都不会访问backup

4.nginx负载均衡算法

Round Robin

#轮询,请求在服务器之间均匀分布,并考虑服务器权重。默认情况下使用此方法(没有启用它的指令)

Least Connections

#最少连接,将请求发送到活动连接数最少的服务器,同样考虑服务器权重

IP Hash

#IP哈希,请求发送到的服务器由客户端 IP 地址确定。在这种情况下,IPv4 地址的前三个八位字节或整个 IPv6 地址用于计算哈希值。该方法保证来自同一地址的请求到达同一服务器,除非它不可用。

一个客户端ip对应一个服务器,但是如果使用CDN反向代理,客户端获得的将都是CDN的ip地址,无法得到真正的客户端IP地址

Generic Hash

#通用哈希,请求发送到的服务器由用户定义的键确定,该键可以是文本字符串、变量或组合。例如,密钥可以是配对的源 IP 地址和端口,也可以是 URI

5.nginx模块编译

给nginx增加sticky模块

工作原理:Sticky是基于cookie的一种负载均衡解决方案,通过分发和识别cookie,使来自同一个客户端的请求落在同一台服务器上,默认cookie标识名为route: 1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。

nginx -s stop

#停止nginx服务

yum install -y unzip

#安装unzip

unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

#解压软件包

cd nginx-1.23.3/

make clean

#清除之前编译的可执行文件及配置文件

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42

#重新配置,--add-module增加第三方模块

open source不自带此模块,如果使用nginx plus则自带

make

#重新编译

\cp -f nginx /usr/local/nginx/sbin/nginx

#覆盖

cd /usr/local/nginx/conf/

vim nginx.conf

nginx -t

#检测语法

nginx

#启动

不断刷新只会显示server2,因为浏览器有cookies

sticky算法适用于有中间场景或者有反向代理的架构

6.虚拟主机

mkdir /www1/

echo web1 > /www1/index.html

#用来做测试

vim /usr/local/nginx/conf/nginx.conf

nginx -t

#检测语法

nginx -s reload

测试:

vim /etc/hosts

7.安全控制

限制并发连接

vim nginx.conf

不使用反向代理

测试:

server4:

yum install -y httpd-tools

#安装工具包

使用压力测试工具ab

ab -c 10 -n 10 http://192.168..145.11/download/iso7.gif

#并发量10 请求数10

cat /usr/local/nginx/logs/access.log

#查看日志

nginx -s reload

#重载

重新测试

此时限制并发量为1,所以报错

ab -c 1 -n 10 http://192.168.145.11/download/iso.gif

#并发量1 请求数10

限制请求速率

vim nginx.conf

nginx -s reload

此时限制并发连接为1,并发速率1

vim nginx.conf

nginx -s relaod

使用此配置时,如果请求速率超过每秒请求数,则超出速率的请求将被放入区域。当区域已满时,过多的请求将被排队,此队列的大小为请求。队列中的请求处理以总速率不大于指定速率的方式延迟。超过突发限制的请求将被拒绝,并显示错误。

如果在流量突发期间不希望延迟请求,请添加以下参数:nodelay

nginx -s reload

使用此配置,无论指定什么,都将立即处理限制内的过多请求,超出突发限制的请求将被拒绝并出现错误。

delay=3

#指定延迟

使用此配置,前 3 个请求将无延迟地传递,接下来的 2 个请求以总速率不大于指定速率的方式延迟,进一步过多的请求将被拒绝,因为已超过总突发大小,后续请求将被延迟。

限制带宽

limit_rate 100k

使用此设置,客户端将能够以每秒千字节的最大速度通过单个连接下载内容。但是,客户端可以打开多个连接。因此,如果目标是防止下载速度超过指定值,则还应限制连接数。

ab -c 1 -n 5 http://192.168.145.11/download/iso7.gif

#并发量1 请求数5

若要仅在客户端下载一定数量的数据后才施加限制,请使用 limit_rate_after 指令。


nginx服务常规配置

1.https配置

 vim /usr/local/nginx/conf/nginx.conf

cd /etc/tki/pls/certs

make cert.pem

mv cert.pem /usr/local/nginx/conf/

cert.pem

#自签名证书

cat cert.pem

证书和私钥都在此文件

检测语法并重载

访问:

https默认端口为443

curl https://www1.westos.org

2.重定向

80重定向到443

对域名重定向:

vim nginx.conf

rewrite ^/(.*)$ https://www1.westos.org/$1 permanent;

# $1位置参数,如果从子页面访问,自动匹配内容

将请求的 URL 路径部分作为参数加到目标 URL 地址中

访问:

www1.westos.org/bbs重定向bbs.westos.org 

vim nginx.conf

server4:

添加解析

vim /etc/hosts

重定向:

因为url后加了index.html,与当前策略不符,重定向失败

修改:

vim  nginx.conf

测试:

此时主站里的论坛bbs可以移除了

3.自动索引

不做索引:

关闭限速后直接展示图片

vim nginx.conf

4.缓存配置

vim nginx.conf

访问:

到期时间2024

5.日志轮转

vim /opt/nginx_log.sh

每天将 Nginx 的访问日志备份并重新打开新的日志文件

chmod +x /opt/nginx_log.sh

#增加可执行权限

crontab -e

可根据产生日志量来决定处理周期

6.站点限制

vim nginx.conf

启用监控模块

激活监控模块

访问定义的URL,实际不存在

vim nginx.conf

nginx -t

nginx -s reload

tail -f logs/access.log

#监控日志

此时再刷新日志无增长记录

vim nginx.conf

只允许本机访问

7.中文乱码

vim index.html

乱码原因是未设定字体

vim nginx.conf

清除浏览器网页缓存

http状态码

需了解,有利于排错

8.防盗链

使用nginx自带的防盗链机制 

配置server2上的apache服务,盗链server1上的图片

server4测试机安装图形,使用浏览器测试

systemctl isolate graphical.target

#切换到图形

systemctl set-default graphical.target

#默认从图形启动

vim /etc/hosts

#添加解析

用浏览器访问server2:daolian.westos.org

此时未做防盗链,所以可以盗取

cd /usr/local/nginx/logs

配置nginx网页防盗链

只允许来源于"www1.westos.org"的请求。如果请求来源不在允许列表中,则会被认为是非法请求($invalid_referer变量为真),然后使用rewrite指令重定向到"http://bbs.westos.org/daolian.jpg"这张图片

重定向到站点以外的地方,可避免过多消耗本身站点的流量

保护图片资源不被非法访问和盗链

www1.westos.org可正常访问


php部署

1.php安装 

yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel

#安装bzip2压缩工具和一些依赖包

yum install -y oniguruma-6.8.2-1.el7.x86_64.rpm oniguruma-devel-6.8.2-1.el7.x86_64.rpm

#同时安装两个RPM包,解决依赖性

tar xf php-7.4.12.tar.bz2

#解压php压缩包

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-curl --with-iconv --with-mhash --with-zlib --with-openssl --enable-mysqlnd --with-mysqli --with-pdo-mysql --disable-debug --enable-sockets --enable-soap --enable-inline-optimization --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring --enable-bcmath --with-fpm-systemd

#配置

make

#按照生成的Makefile文件指定规则编译

make install

#安装

2.php配置 

vim php-fpm.conf

#在全局配置中打开pid,程序会新建pid

cd php-fpm.d/

vim www.conf

如果将php部署在其他主机上,则需要部署监听ipv4或ipv6地址,或监听特定端口上所有地址

cd /root/php-7.4.12/

#进入php源码目录

cp php.ini-production /usr/local/php/etc/php.ini

#拷贝主配置文件

vim /usr/local/php/etc/php.ini

cp php-fpm.service /usr/lib/systemd/system

#拷贝启动脚本

vim /usr/lib/systemd/system

systemctl daemon-reload

#重载systemd配置文件

systemctl start php-fpm

#启动php-fpm

netstat -antlp | grep :9000

systemctl enable php-fpm

#设置开机自启

3.nginx与php整合

nginx处理并发能力强,将nginx与php整合可以更有效地处理动态内容,提高web服务器的性能和效率

cd /usr/local/nginx/conf

vim nginx.conf

#编辑nginx主配置文件

cat fastcgi.conf

#查看文件

nginx -s reload

#重载nginx

vim /usr/local/nginx/html/index.php

#生成php访问测试文件

phpinfo()

#此函数作用是输出当前php解释器的配置信息和环境变量

测试:

在浏览器访问: http://192.168.145.11/index.php

添加php环境变量

vim ~/.bash_profile

将/usr/local/php/bin添加到系统的PATH变量中

source ~/.bash_profile

#使文件生效

查找php命令路径

4.php动态扩展模块

缺少configure

利用phpize生成

yum install -y autoconf

#安装此工具

再次执行phpize

./configure

#配置

make

#编译

make install

#安装

php -m

#列出php所有的扩展模块(modules)

未读取此程序

vim /usr/local/php/etc/php.ini

#编辑php主配置文件

#动态扩展配置区域

systemctl reload php-fpm

#重载php-fpm

cd ~/memcache-4.0.5.2/

cp example.php memcache.php /usr/local/nginx/html/

#拷贝测试文件到nginx默认发布目录

yum install -y memcached

#安装memcached服务

systemctl enable --now memcached

#打开并开机启动

该软件使用物理内存作为缓存空间,用于加速,缺点是服务重启时,会丢失缓存数据

vim memcache.php

#用于监控内存缓存状态

若部署在远程主机,则要写入该主机ip

测试:

浏览器访问:http://192.168.145.11/memcache.php

测试:

访问http://192.168.145.11/example.php

刷新几次,查看缓存命中状态

在server4中测试:

ab -c 10 -n 500 http://192.168.145.11/index.php

存在失败说明请求过大,超过处理能力,可降低并发或减少请求

对比:

nginx高速缓存

仅在php使用memcache模块还不是最佳的处理方式

client -> nginx -> *.php -> fastcgi_pass -> php-fpm:9000 -> nginx -> client

这种方式客户端等待时间过长,都需要后端9000端口处理,等待时间主要取决于php处理的速度

此为传统缓存逻辑,并非最优

是否可以将数据缓存功能直接交给nginx?用来加快处理速度

1.openresty部署

openresty与nginx一样,也监听的是80端口

所以先停止nginx服务,避免端口冲突

nginx -s stop

#停用nginx

systemctl disable --now httpd

#也可以停用apache,暂时用不到

tar xf openresty-1.21.4.1.tar.gz

#解压

可以和nginx用同样的方法编译

Ctrl+R搜索

也不用加sticky模块

./configure --prefix=/usr/local/openresty --with-http_ssl_module --with-http_stub_status_module

#配置

make

#编译

make install

#安装

cd /usr/local/openresty/nginx

cd conf/

用之前写好的nginx配置文件覆盖当前目录的

/usr/local/openresty/nginx/sbin/nginx -t

#检测语法

报错,因为此版本不带sticky模块功能

vim nginx.conf

将此功能关闭

再次检测语法

cp /usr/local/nginx/conf/cert.pem .

#将原来版本的证书也拷贝到当前

再次检测,无报错

/usr/local/openresty/nginx/sbin/nginx

#启动openresty

测试:

用浏览器访问:http://192.168.145.11

2.nginx配置高效缓存

将缓存功能前置到nginx

vim /usr/local/openresty/nginx/conf/nginx.conf

keepalive 512表示与上游服务器的连接保持活动状态的最大请求数为512

memcache使用键值存储引擎(Key-Value),每个数据项都与一个唯一的键(key)相关联,这样可以通过键来快速访问和检索数据。

set $key $uri$args

#将请求的URI和参数组合成一个键(key),以便作为缓存项的唯一标识。

srcache_fetch GET /memc $key

#表示使用GET方法从缓存中获取以"/memc"作为前缀的键对应的缓存项。如果该缓存项存在且有效,Nginx会返回缓存的响应给客户端,而不会将请求转发到后端服务器。如果没有,则通过后端服务处理。

srcache_store PUT /memc $key

#表示使用PUT方法将响应内容缓存到以"/memc"为前缀的键对应的缓存项中。这样,当下次相同的请求到达时,Nginx就可以直接从缓存中返回响应,而无需再次访问后端服务器。

#检测语法

/usr/local/openresty/nginx/sbin/nginx -s reload

#重载

测试:

server4:

高效缓存为服务多加了一层缓冲,减轻了后端服务器的压力

3.nginx日志可视化

先停用openresty,切回原来版本nginx

用肉眼查看日志比较困难,可用goaccess小程序查看

yum install -y GeoIP-devel-1.5.0-13.el7.x86_64.rpm

yum install ncurses-devel

#安装依赖性

tar xf goaccess-1.4.tar.gz

#解压软件

./configure --enable-utf8 --enable-geoip=legacy

#配置

make

#编译

make install

#安装

若未指定安装路径则会自动安装到/usr/local/bin/目录下,在系统环境变量路径中,这样可以直接调用

goaccess /usr/local/nginx/logs/access.log -o /usr/local/nginx/html/report.html --log-format=COMBINED --real-time-html &

#启动

#/usr/local/nginx/logs/access.log是日志的路径

#-o /usr/local/nginx/html/report.html指定生成的实时HTML报告的输出路径和文件名

#--log-format=COMBINED指定日志格式

#--real-time-html--log-format=COMBINED

# &打入后台

测试:

用浏览器访问

session共享

1.部署tomcat 

Tomcat是一个开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,并提供了一个运行Java Web应用程序的环境。

以下是关于Tomcat的一些基本信息:

  1. 功能:Tomcat主要用于部署和运行Java Web应用程序。它可以处理客户端的请求并调用相应的Servlet来生成动态的Web内容。Tomcat还支持JavaServer Pages(JSP)和Java Servlet规范,使得开发人员可以使用Java语言创建动态Web应用程序。

  2. 架构:Tomcat是一个基于Java的Web服务器,它由一个核心的Servlet容器组件和多个可选的扩展组件组成。核心组件负责处理HTTP请求和响应,以及管理Servlet的生命周期。扩展组件可以提供额外的功能,如SSL加密、JNDI数据源、连接池等。

  3. 安装和配置:要使用Tomcat,你需要下载适合你操作系统的二进制包,并按照官方文档中的步骤进行安装和配置。主要的配置文件包括server.xmlweb.xmlcontext.xml,它们允许你定义Tomcat的监听端口、虚拟主机、上下文路径等设置。

  4. 部署应用程序:将你的Java Web应用程序打包成WAR(Web Archive)文件,然后将它部署到Tomcat的webapps目录下。Tomcat会自动解压WAR文件并将应用程序部署到相应的上下文路径。

  5. 管理和监控:Tomcat提供了一个Web界面(通常是http://localhost:8080/manager)用于管理和监控部署在Tomcat上的应用程序。通过这个界面,你可以启动、停止、重新加载应用程序,查看日志文件等。

在server2:

rpm -ivh jdk-8u121-linux-x64.rpm

#安装jdk

tar xf apache-tomcat-7.0.37.tar.gz -C /usr/local/

#将tomcat压缩包解压提取到/usr/local/目录下

cd tomcat/

运行startup.sh脚本

#启动服务

端口为8080

测试:

用浏览器访问:

http://192.168.12:8080

index.jsp

#默认发布页

在浏览器访问:

http://192.168.145.12:8080/test.jsp

cd /usr/local/tomcat/logs/

server3与server2相同,注意避免端口冲突,要先将之前端口也设置为8080的apache停用

2.nginx整合tomcat

因为tomcat也不支持高并发,所以可以与nginx整合

server1:

若仅配置一台server2

cd /usr/local/nginx/conf/

vim nginx.conf

#编辑nginx配置文件

若有多台server:

基于cookie的负载均衡更适合这种场景

server1:

vim nginx.conf

之前的session丢失

3.tomcat整合memcached

tomcat服务通过msm模块把session信息交叉存储到memcached上

server2:

yum install -y memcached

#安装memcached模块

systemctl enable --now memcached

#启动

yum install -y unzip

#安装unzip

将这些模块都移动到/usr/local/tomcat/lib/目录中

cd /usr/local/tomcat/conf/

vim context.xml

#编辑tomcat配置文件

cat logs/catalina.out

若无报错说明msm模块版本不对应

server3操作同理

重启

测试:

访问 http://192.168.145.11/test.jsp

server2:

yum install -y telnet

telnet localhost 11211

#复制sessionID

与test.jsp页面中的信息对应

telnet 192.168.145.13 11211

#连接server3

说明数据存到了n1节点

关闭server3的tomcat服务

systemctl stop memcached.service

#关闭server2上的memcached服务

数据没有丢失的原因是,memcached中的缓存是冗余的,n1的缓存消失,但是server3上的tomcat服务仍有缓存

重启server3上tomcat

直接关闭服务器server2

只要两个环节中所有并行服务不同时挂掉,那么数据就不会丢失

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-17 09:30:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-17 09:30:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-17 09:30:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-17 09:30:02       18 阅读

热门阅读

  1. 基于单片机的电梯系统模拟与研究

    2024-03-17 09:30:02       17 阅读
  2. 音乐软件开发的C#编程思路与实现

    2024-03-17 09:30:02       19 阅读
  3. 【uniapp】uniapp的安卓apk图标角标设置消息数量

    2024-03-17 09:30:02       17 阅读
  4. 有向图的DFS(c++题解)

    2024-03-17 09:30:02       21 阅读
  5. three.js工厂点击动画、标签

    2024-03-17 09:30:02       23 阅读
  6. 贝叶斯定理,先验信念,似然,后验概率

    2024-03-17 09:30:02       27 阅读
  7. Hadoop基础架构及其特点解析

    2024-03-17 09:30:02       18 阅读
  8. C#编程语言在软件开发中的深度应用与实践

    2024-03-17 09:30:02       20 阅读
  9. C语言初阶测试

    2024-03-17 09:30:02       20 阅读
  10. DNS服务

    DNS服务

    2024-03-17 09:30:02      19 阅读
  11. Json格式解析

    2024-03-17 09:30:02       20 阅读
  12. [小程序开发] 构造页面

    2024-03-17 09:30:02       18 阅读