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: downloadhttps://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
内核参数是根据本机物理资源自动配置的,一般不需要修改
负载均衡设置
HTTP Load Balancing | NGINX DocumentationLoad balance HTTP traffic across web or application server groups, with several algorithms and advanced features like slow-start and session persistence.https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
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的一些基本信息:
-
功能:Tomcat主要用于部署和运行Java Web应用程序。它可以处理客户端的请求并调用相应的Servlet来生成动态的Web内容。Tomcat还支持JavaServer Pages(JSP)和Java Servlet规范,使得开发人员可以使用Java语言创建动态Web应用程序。
-
架构:Tomcat是一个基于Java的Web服务器,它由一个核心的Servlet容器组件和多个可选的扩展组件组成。核心组件负责处理HTTP请求和响应,以及管理Servlet的生命周期。扩展组件可以提供额外的功能,如SSL加密、JNDI数据源、连接池等。
-
安装和配置:要使用Tomcat,你需要下载适合你操作系统的二进制包,并按照官方文档中的步骤进行安装和配置。主要的配置文件包括
server.xml
、web.xml
和context.xml
,它们允许你定义Tomcat的监听端口、虚拟主机、上下文路径等设置。 -
部署应用程序:将你的Java Web应用程序打包成WAR(Web Archive)文件,然后将它部署到Tomcat的
webapps
目录下。Tomcat会自动解压WAR文件并将应用程序部署到相应的上下文路径。 -
管理和监控: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
只要两个环节中所有并行服务不同时挂掉,那么数据就不会丢失