【企业高性能web服务器】

ops/2024/9/20 1:22:35/ 标签: 服务器, 运维

目录

  • 一、Nginx 介绍
    • 1、 Nginx 功能介绍
    • 2、基础特性
    • 3、Nginx 模块介绍
  • 二、Nginx 编译安装
    • 1、编写systemd服务
  • 三、平滑升级和回滚
    • 1、平滑升级的流程
    • 2、升级
    • 2、回滚
  • 四、 Nginx 核心配置详解
    • 1、实现 nginx 的高并发配置
    • 2、Nginx 账户认证功能
    • 3、nginx作为下载服务器配置
  • 五、rewrite 指令
    • 1、 rewrite flag 使用介绍
    • 2、 rewrite案例: 自动跳转 https
    • 3、Nginx 防盗链
    • 4、实现防盗链
  • 六 Nginx 反向代理功能
    • 1、实战案例: 反向代理单台 web 服务器
    • 2、针对特定资源实现动静分离
    • 3、反向代理示例: 缓存功能
      • 4、非缓存场景压测
      • 准备缓存配置
  • 七、http 反向代理负载均衡
    • 1、反向代理示例: 后端多台 web服务器
    • 2、实战案例: 基于Cookie 实现会话绑定
  • 八、实现 Nginx 四层负载均衡
    • 1、负载均衡实例: MySQL
  • 九、实现 FastCGI
    • 1、FastCGI实战案例 : Nginx与php-fpm在同一服务器
  • 十、php的动态扩展模块(php的缓存模块)
    • 1、安装memcache模块
    • 2、配置php加载memcache模块
    • 3、部署memcached
  • 十一、php高速缓存

一、Nginx 介绍

1、Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus )
2、2019年3月11日 F5 Networks 6.7亿美元的价格收购
3、Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器
4、解决C10K问题(10K Connections)
Nginx官网:http://nginx.org

二次开发的发行版

  • Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine成为一个开源项目官网: http://tengine.taobao.org/
  • OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,官网 : https://openresty.org/cn/

1、 Nginx 功能介绍

  • 静态的web资源服务器html,图片,js,css,txt等静态资源
  • http/https协议的反向代理
  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求、
  • tcp/udp协议的请求转发(反向代理)
  • imap4/pop3协议的反向代理

2、基础特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmap,sendfile

3、Nginx 模块介绍

nginx 有多种模块:
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件
驱动机制 、进程管理等核心功能
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应
头设置 等等
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 
多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的
支持
Stream服务模块: 实现反向代理功能,包括TCP协议代理
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支
持等
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载

二、Nginx 编译安装

官方源码包下载地址:https://nginx.org/en/download.html

[root@nginx-1 ~]# https://nginx.org/download/nginx-1.24.0.tar.gz
[root@nginx-1 ~]# tar -xvf nginx-1.24.0.tar.gz 
#查看检查配置的参数
[root@nginx-1 nginx-1.24.0]# ./configure --help./configure --prefix=/usr/local/nginx \
--user=nginx \ # 指定nginx运行用户
--group=nginx \ # 指定nginx运行组
--with-http_ssl_module \ # 支持https:
--with-http_v2_module \ # 支持http版本2
--with-http_realip_module \ # 支持ip透传
--with-http_stub_status_module \ # 支持状态页面
--with-http_gzip_static_module \ # 支持压缩
--with-pcre \ # 支持正则
--with-stream \ # 支持tcp反向代理
--with-stream_ssl_module  # 支持tcp的ssl加密

在这里插入图片描述
缺少依赖:
在这里插入图片描述
在这里插入图片描述
依次推:

[root@nginx-1 nginx-1.24.0]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
[root@nginx-1 nginx-1.24.0]# make

执行make的命令会生成:
在这里插入图片描述
执行make install 就是把这里面的nginx文件拷贝到/usr/local/nginx这个目录下

[root@nginx-1 nginx-1.24.0]# make install
#添加一个没有系统用户
[root@nginx-1 nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
#安装好会生成这些文件
[root@nginx-1 nginx-1.24.0]# ll /usr/local/nginx/
total 4
drwxr-xr-x. 2 root root 4096 Aug 15 23:11 conf
drwxr-xr-x. 2 root root   40 Aug 15 23:11 html
drwxr-xr-x. 2 root root    6 Aug 15 23:11 logs
drwxr-xr-x. 2 root root   19 Aug 15 23:11 sbin
conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他
的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params
两个文件,配置文件一般都有一个样板配置文件,是以.default为后缀,使用时可将其复制并将default后缀
去掉即可。
html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web
文件是默认的错误页面提示页面。
logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比
如/var/logs/nginx里面。
sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。

为了方便执行nginx程序:

[root@nginx-1 nginx-1.24.0]# grep export ~/.bash_profile 
export PATH=$PATH:/usr/local/nginx/sbin
[root@nginx-1 nginx-1.24.0]# source ~/.bash_profile[root@nginx-1 ~]# nginx -v
nginx version: nginx/1.24.0

nginx常用的命令:

 -t            : test configuration and exit  #检查nginx的配置-s signal     : send signal to a master process: stop, quit, reopen, reload

在这种方式他不能实现开机自启:

1、编写systemd服务

[root@nginx-1 ~]# cat /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@nginx-1 ~]# systemctl daemon-reload 
[root@nginx-1 ~]# systemctl restart nginx.service

三、平滑升级和回滚

有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级。

1、平滑升级的流程

将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
向master进程发送USR2信号
master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主
进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进
程的PID存放至新生成的pid文件nginx.pid
向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT

2、升级

#下载升级的nginx源码
[root@nginx-1 ~]# wget https://nginx.org/download/nginx-1.26.2.tar.gz
[root@nginx-1 ~]# tar -xvf nginx-1.26.2.tar.gz
[root@nginx-1 nginx-1.26.2]# ./configure --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
[root@nginx-1 nginx-1.26.2]# make  #不要make install
#备份nginx文件
[root@nginx-1 nginx-1.26.2]# cd /usr/local/nginx/sbin/
[root@nginx-1 sbin]# ll
total 5524
-rwxr-xr-x. 1 root root 5654232 Aug 15 23:11 nginx
[root@nginx-1 sbin]# \cp -f nginx nginx.old
[root@nginx-1 sbin]# ll
total 11048
-rwxr-xr-x. 1 root root 5654232 Aug 15 23:11 nginx
-rwxr-xr-x. 1 root root 5654232 Aug 15 23:42 nginx.old

这个时候nginx是启动的,可以开始平滑升级,用户也不知

#将新的nginx文件copy过来,覆盖nginx
[root@nginx-1 sbin]# \cp -f /root/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin/
#查看nginx的pid文件
[root@nginx-1 sbin]# cat ../logs/nginx.pid 
18696
[root@nginx-1 sbin]# kill -USR2 18696
[root@nginx-1 sbin]# ps -aux|grep nginx
#回收旧版本
[root@nginx-1 sbin]#  kill -WINCH 18696

[root@nginx-1 sbin]# nginx -v
nginx version: nginx/1.26.2
升级成功

2、回滚

#如果升级的版本发现问题需要回滚,可以重新拉起旧版本的worker
[root@nginx-1 sbin]# \cp -f  nginx.old nginx
[root@nginx-1 sbin]# \cp -f  nginx.old nginx
[root@nginx-1 sbin]#  kill -HUP 18696
[root@nginx-1 sbin]# ps -aux|grep nginx
root       18696  0.0  0.0   9888  2616 ?        Ss   23:29   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root       21814  0.0  0.1   9896  6356 ?        S    23:47   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     21815  0.0  0.1  13704  4604 ?        S    23:47   0:00 nginx: worker process
nginx      21839  0.0  0.1  13696  4740 ?        S    23:52   0:00 nginx: worker process
root       21841  0.0  0.0   6412  2252 pts/0    S+   23:52   0:00 grep --color=auto nginx
[root@nginx-1 sbin]# kill -WINCH 21814
#关闭老master
[root@nginx-1 sbin]# kill -QUIT 21814

[root@nginx-1 sbin]# nginx -v
nginx version: nginx/1.24.0
回滚成功

四、 Nginx 核心配置详解

nginx 官方帮助文档:http://nginx.org/en/docs/

1、实现 nginx 的高并发配置

编辑主配置文件
worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU  #将Nginx工作进程绑定到指定的CPU核心
[root@nginx ~]# nginx -s reload

在这里插入图片描述
发现有两个woker进程了
在这里插入图片描述
修改nginx的并发连接数

worker_connections 1024; #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为

2、Nginx 账户认证功能

由 ngx_http_auth_basic_module 模块提供此功能

#创建一个用户,并把账号密码保存到.htpasswd这个文件中
[root@nginx ~]# htpasswd -cm /usr/local/nginx/conf/.htpasswd gang
New password: 
Re-type new password: 
Adding password for user gang#nginx的配置
[root@nginx ~]# cat /usr/local/nginx/conf.d/php.conf 
server {listen 80;server_name 172.25.254.100;root /data/php;location / {root /data/html;index index.html;auth_basic "login password";auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";}
}

测试:
在这里插入图片描述

3、nginx作为下载服务器配置

ngx_http_autoindex_module 模块处理以斜杠字符 “/” 结尾的请求,并生成目录列表,可以做为下载服务配置使用。

autoindex on | off; #自动文件索引功能,默为off
autoindex_exact_size on | off; #计算文件确切大小(单位bytes),off 显示大概大小(单位K、
M),默认on
autoindex_localtime on | off ; #显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp; #显示索引的页面文件风格,默认html
limit_rate rate; #限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位
B/s,bytes/second, #默认值0,表示无限制,此指令由
ngx_http_core_module提供
set $limit_rate 4k; #也可以通变量限速,单位B/s,同时设置,此项优级高.

nginx配置:

在这里插入图片描述
重载配置文件进行测试:

测试:
在这里插入图片描述

五、rewrite 指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,
rewrite主要是针对用户请求的URL或者是URI做具体处理。
官网:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html
语法格式:

rewrite regex replacement [flag];

rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI。
如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向
301。

1、 rewrite flag 使用介绍

利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时
重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型。

redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求,状态码:301
break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作
#而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用
#适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,
#而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户

永久重定向和临时重定向的一个区别:1、状态码不同;2、永久重定向会缓存DNS解析记录,临时重定向不会。

2、 rewrite案例: 自动跳转 https

案例:基于通信安全考虑公司网站要求全站 https,因此要求将在不影响用户请求的情况下将http请求全部自动跳转至 https,另外也可以实现部分 location 跳转。

#制作证书,创建证书的目录
[root@nginx ~]# mkdir /usr/local/nginx/certs
openssl req  -newkey  rsa:2048 -nodes -sha256 -keyout /usr/local/nginx/certs/gang.key \
-x509  -days 365 -out /usr/local/nginx/certs/gang.crt[root@nginx ~]# cat /usr/local/nginx/conf.d/https.conf
server{listen 80;listen 443 ssl;server_name 172.25.254.100;root /data/web/;index index.html;ssl_certificate      /usr/local/nginx/certs/gang.crt;ssl_certificate_key  /usr/local/nginx/certs/gang.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;location / {if ( $scheme = http ){rewrite /(.*) https://$host/$1 redirect;}if ( !-e $request_filename ){rewrite /(.*) https://$host/index.html redirect;}}
}

解释:第一个if语句就是匹配用户如果是输入的http协议,给它临时定向到https,第二个if就是他访问的uri不存在,就给他定向到默认发布目录。

测试:http访问,跳转到https页面
在这里插入图片描述
测试:访问一个不存在的页面,定向到默认发布页面
在这里插入图片描述

3、Nginx 防盗链

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的那个网站域名,正常的referer信息有以下几种。

none: #请求报文首部没有referer首部,
#比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked: #请求报文有referer首部,但无有效值,比如为空。
server_names: #referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string: #自定义指定字符串,但可使用*作通配符。示例: *.timinglee.org
www.timinglee.*
regular expression: #被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:
~.*\.timinglee\.com

4、实现防盗链

nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有效实现防盗链功能。

#定义防盗链:创建一个目录存放图片
[root@nginx conf.d]# mkdir /data/web/images -p
[root@nginx conf.d]# cat https.conf 
server{listen 80;listen 443 ssl;server_name 172.25.254.100;root /data/web/;index index.html;ssl_certificate      /usr/local/nginx/certs/gang.crt;ssl_certificate_key  /usr/local/nginx/certs/gang.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;location /images {valid_referers none blocked server_names 172.25.254.* ~\.baidu\.;}location / {if ( $scheme = http ){rewrite /(.*) https://$host/$1 redirect;}if ( !-e $request_filename ){rewrite /(.*) https://$host/index.html redirect;}}
}
#新建一台虚拟机,安装httpd服务
[root@web ~]# yum install httpd
[root@web ~]# vim /var/www/html/index.html 
#准备盗链web页面:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><img src="https://172.25.254.100/images/index.png" alt="" width="100px" height="100px"><p><a href="https://172.25.254.100/">从这里点进去</a></p>
</body>
</html>
[root@web ~]# systemctl restart httpd
测试:正常访问

查看172.25.254.100的访问日志,可以看到172.25.254.110盗链了他的资源:
在这里插入图片描述

要是防止别人盗链的话:加上下面的命令
在这里插入图片描述
测试:110这台主机不能看到我的图片呀!
在这里插入图片描述

如果110这台主机盗用我的盗链,我还可以给他看同一个图片,对他好点,全给他看美女吧!
在这里插入图片描述
编辑配置文件,重启,测试:
在这里插入图片描述

六 Nginx 反向代理功能

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。
Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能。

ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass
#等指令引用的后端服务器分组
ngx_stream_proxy_module: #将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module: #将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

关于同构代理和异构代理:

同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器
异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需要经过处理才能被访问

1、实战案例: 反向代理单台 web 服务器

#110作为真实的rs,100做反向代理服务器
[root@nginx conf.d]# cat fx.conf 
server{listen 80;server_name 172.25.254.100;location / {proxy_pass http://172.25.254.110;}
}

测试:
在这里插入图片描述

2、针对特定资源实现动静分离

#nginx这台服务器配置
[root@nginx conf.d]# cat fx.conf 
server{listen 80;server_name 172.25.254.100;location /php {proxy_pass http://172.25.254.110;}location /static {proxy_pass http://172.25.254.120;}
}
[root@nginx conf.d]# nginx -s reload
#110这台服务器配置
[root@web ~]# yum install php-fpm
[root@web ~]# systemctl restart httpd
[root@web ~]# mkdir /var/www/html/php
[root@web ~]# vim /var/www/html/php/index.php
[root@web ~]# cat /var/www/html/php/index.php
<?php
echo "Hello, World!";
?>
#120这台服务器的配置
[root@web2 ~]# mkdir /var/www/html/static -p
[root@web2 ~]# echo static page > /var/www/html/static/index.html

测试:
访问nginx的服务器地址:
在这里插入图片描述
在这里插入图片描述

3、反向代理示例: 缓存功能

缓存功能默认关闭状态,需要先动配置才能启用.

4、非缓存场景压测

[root@web ~]# ab -n10000 -c100 http://172.25.254.100/static/index.html
Failed requests:        0
Total transferred:      2620000 bytes
HTML transferred:       120000 bytes
Requests per second:    2017.71 [#/sec] (mean)
Time per request:       49.561 [ms] (mean)

准备缓存配置

在主配置文件nginx.conf的http配置段添加:
在这里插入图片描述
子配置文件的配置添加项:
在这里插入图片描述
访问之后就会自动生成缓存数据的目录:
在这里插入图片描述

#再次访问测试:
[root@web ~]# ab -n10000 -c100 http://172.25.254.100/static/index.html
Concurrency Level:      100
Time taken for tests:   2.964 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2620000 bytes
HTML transferred:       120000 bytes
Requests per second:    3373.59 [#/sec] (mean)
Time per request:       29.642 [ms] (mean)

进行对比发现处理请求快了不少:

Requests per second:    2017.71 [#/sec] (mean)
Requests per second:    3373.59 [#/sec] (mean)

七、http 反向代理负载均衡

在上一个节中Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而且不能对后端服务器提供相应的服务器状态监测,Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能。
官方文档: https://nginx.org/en/docs/http/ngx_http_upstream_module.html

1、反向代理示例: 后端多台 web服务器

环境说明:

172.25.254.100 #Nginx 代理服务器
172.25.254.110 #后端web A,Apache部署
172.25.254.120 #后端web B,Apache部署

分别测试访问,确保后端服务器没撒问题。
配置 nginx 反向代理
注意: 本节实验过程中先关闭缓存
子配置文件配置:
在这里插入图片描述
测试:轮询调度成功!
在这里插入图片描述

2、实战案例: 基于Cookie 实现会话绑定

在这里插入图片描述
测试:同一个cookie会被调度到同一台服务器
在这里插入图片描述

八、实现 Nginx 四层负载均衡

Nginx在1.9.0版本开始支持tcp模式的负载均衡,在1.9.13版本开始支持udp协议的负载,udp主要用于
DNS的域名解析,其配置方式和指令和http 代理类似,其基于ngx_stream_proxy_module模块实现tcp负载,另外基于模块ngx_stream_upstream_module实现后端服务器分组转发、权重分配、状态监测、调度算法等高级功能。

1、负载均衡实例: MySQL

后端两台服务器安装 MySQL

[root@web ~]# yum install mariadb-server -y
[root@web ~]# systemctl start mariadb
[root@web ~]#  grep server-id /etc/my.cnf.d/mariadb-server.cnf
server-id=1
另一台数据库服务设置为2就行。
[root@web ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';"
[root@web ~]# systemctl restart mariadb.service
注意,两台数据库服务器都要做相应的配置

编辑子配置文件重新加载配置:
[root@nginx conf]# vim /usr/local/nginx/conf/tcp/tcp.conf
不能写在conf.d的目录里,因为那是http的子配置文件;
并且在主配置文件添加这个目录,在http的外部写。
在这里插入图片描述

在这里插入图片描述
测试:成功
在这里插入图片描述

九、实现 FastCGI

CGI的由来:

最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏
览器,也就是静态html文件,但是后期随着网站功能增多网站开发也越来越复杂,以至于出现动态技
术,比如像php(1995)、java(1995)、python(1991)语言开发的网站,但是nginx/apache服务器并不
能直接运行 php、java这样的文件,apache实现的方式是打补丁,但是nginx缺通过与第三方基于协议实
现,即通过某种特定协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户
的请求,处理完成后返回数据给Nginx并回收进程,最后nginx在返回给客户端,那这个约定就是通用网
关接口(common gateway interface,简称CGI),CGI(协议) 是web服务器和外部应用程序之间的接口
标准,是cgi程序和web服务器之间传递信息的标准化接口。

为什么会有FastCGI?

CGI协议虽然解决了语言解析器和 Web Server 之间通讯的问题,但是它的效率很低,因为 Web Server每收到一个请求都会创建一个CGI进程,PHP解析器都会解析php.ini文件,初始化环境,请求结束的时候再关闭进程,对于每一个创建的CGI进程都会执行这些操作,所以效率很低,而FastCGI是用来提高CGI性能的,FastCGI每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。

什么是PHP-FPM?

FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能。
进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自web server
的请求worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进行PHP代码的处理

1、FastCGI实战案例 : Nginx与php-fpm在同一服务器

php官方网站:www.php.net

[root@nginx-1 ~]# yum install php-fpm -y
[root@nginx-1 ~]# systemctl start php-fpm.service 
[root@nginx-1 ~]# egrep "^user|^group" /etc/php-fpm.d/www.conf
user = nginx
group = nginx
[root@nginx-1 conf]# vim /etc/php-fpm.d/www.conf
添加:listen = 9000
#创建一个php的目录
[root@nginx-1 ~]# mkdir /data/php -p
[root@nginx-1 ~]# cat /data/php/index.php
<?phpphpinfo();
?>

Nginx配置转发
Nginx安装完成之后默认生成了与fastcgi的相关配置文件,一般保存在nginx的安装路径的conf目录当
中,比如/apps/nginx/conf/fastcgi.conf、/apps/nginx/conf/fastcgi_params。

[root@nginx-1 conf.d]# cat /usr/local/nginx/conf.d/php.conf 
server {listen 80;server_name 127.0.0.1;root /data/php;location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}
}
#加载配置文件
[root@nginx-1 conf.d]# nginx -s reload

测试下:
在这里插入图片描述
用ab命令进行压力测试:

[root@nginx-1 ~]# yum install httpd-tools
[root@nginx-1 ~]# ab -n500 -c100 http://172.25.254.200/index.php

在这里插入图片描述
php处理请求太慢了;

十、php的动态扩展模块(php的缓存模块)

软件下载:http://pecl.php.net/package/memcache

1、安装memcache模块

解压:
[root@nginx-1 ~]# tar -xvf memcache-8.2.tgz
[root@nginx-1 memcache-8.2]# yum install autoconf -y
[root@nginx-1 memcache-8.2]# ./configure && make && make install
[root@Nginx memcache-8.2]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-
20230831/
memcache.so opcache.so[root@Nginx memcache-8.2]# cp example.php memcache.php /data/php/
[root@Nginx ~]# vim /data/php/memcache.php
define('ADMIN_USERNAME','admin'); // Admin Username
define('ADMIN_PASSWORD','gang'); // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array

2、配置php加载memcache模块

[root@Nginx ~]# vim /usr/local/php/etc/php.ini
;extension=zip
extension=memcache
;zend_extension=opcache
[root@Nginx ~]# systemctl reload php-fpm
[root@Nginx no-debug-non-zts-20230831]# php -m | grep mem
memcache

3、部署memcached

[root@Nginx ~]# yum install memcached -y
[root@Nginx ~]# systemctl enable --now memcached.service
[root@Nginx ~]# netstat -antlupe | grep memcache
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN
976 1037243 186762/memcached
[root@Nginx ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1"

测试:
在这里插入图片描述
在这里插入图片描述

性能对比:

[root@nginx memcache-8.2]# ab -n500 -c10 http://172.25.254.100/example.php

在这里插入图片描述

十一、php高速缓存

在我们安装的nginx中默认不支持memc和srcache功能,需要借助第三方模块来让nginx支持此功能,所以nginx需要重新编译。

[root@Nginx ~]# rm -fr /urs/local/nginx/
[root@Nginx ~]# tar zxf srcache-nginx-module-0.33.tar.gz
[root@Nginx ~]# tar zxf memc-nginx-module-0.20.tar.gz
[root@Nginx ~]# cd nginx-1.26.1/
[root@Nginx nginx-1.26.1]# ./configure --prefix=/urs/local/nginx/ --user=nginx --
group=nginx --with-http_ssl_module --with-http_v2_module --withhttp_realip_module --with-http_stub_status_module --with-http_gzip_static_module
--with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --
add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module-
0.33
[root@Nginx nginx-1.26.1]# make && make install
[root@Nginx ~]# vim /urs/local/nginx/conf.d/php.conf
upstream memcache {
server 127.0.0.1:11211;
keepalive 512;
}
server {
listen 80;
server_name php.timinglee.org;
root /data/php;
location /memc {
internal;
memc_connect_timeout 100ms;
memc_send_timeout 100ms;
memc_read_timeout 100ms;
set $memc_key $query_string; #使用内置变量$query_string来作为key
set $memc_exptime 300; #缓存失效时间300秒
memc_pass memcache;
}
location ~ \.php$ {
set $key $uri$args; #设定key的值
srcache_fetch GET /memc $key; #检测mem中是否有要访问的php
srcache_store PUT /memc $key; #缓存为加载的php数据
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
[root@Nginx ~]# systemctl start nginx.service

http://www.ppmy.cn/ops/97061.html

相关文章

vue3--定时任务cron表达式组件比较

## 背景&#xff1a; 之前使用vue2开发项目时&#xff0c;使用了cron组件&#xff0c;比较了两种组件的使用效果。现在需要把原有的vue2项目升级为vue3&#xff0c;需要对应的cron组件。 方案一&#xff0c;vue3-cron-plus 具体实现&#xff1a; 安装插件 npm install vue3-…

SEO之网站结构优化(十二-绝对路径和相对路径)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客&#xff1a;阿幸SEO~探索搜索排名之道 绝对路径指的是包含城名的完…

奇异递归Template有啥奇的?

如果一个模版看起来很头痛&#xff0c;那么大概率这种模版是用来炫技&#xff0c;没啥用的&#xff0c;但是CRTP这个模版&#xff0c;虽然看起来头大&#xff0c;但是却经常被端上桌~ 奇异递归模板模式&#xff08;Curiously Recurring Template Pattern, CRTP&#xff09;是一…

数字人的形象克隆与语音克隆是伪需求

形象克隆与语音克隆技术&#xff0c;在当前的环境上已经可以成熟的实现&#xff0c;但真的解决了痛点问题吗&#xff1f; 普通人或者一般的公司克隆自己内部人的形象有必要吗&#xff1f;对外界而言&#xff0c;克隆的形象与虚拟的形象并无二致&#xff0c;本身并没有什么知名…

【区块链+商贸零售】消费券 2.0 应用方案 | FISCO BCOS应用案例

方案基于FISCO BCOS区块链技术与中间件平台WeBASE&#xff0c;实现新一代消费券安全精准高效发放&#xff0c;实现消费激励&#xff0c; 促进消费循环。同时&#xff0c;方案将用户消费数据上链&#xff0c;实现账本记录与管理&#xff0c;同时加密机制保证了数据安全性。

【Axure视频教程】中继器表格——设置文字颜色

今天教大家在Axure制作将控制中继器内部控制文字颜色的原型模板&#xff0c;效果包括&#xff1a; 1、用中继器表格的数据来控制文字的颜色&#xff0c;例如60分以下红色文字&#xff0c;90分以上绿色文字双击分值的格子2 2、可以填写或修改分值&#xff0c;修改后根据新值自…

当SOA遇到DDD

本文讨论软件设计中的决策&#xff0c;特别是关于将较大的系统拆分为多个可独立部署的服务端点。不会特别讨论【服务端点设计】&#xff0c;但我想探讨一下为创建多个服务应用程序进行构思的阶段。 面对复杂问题&#xff0c;通常试图理解复杂性的各部分。将问题拆解为更易于理…

C#使用Modbus TCP通讯PLC,实现读写寄存器

一、创建一个Moudbus类&#xff0c;引入NModbus和Modbus这两个包 #region ModbusTCPpublic class NmodbusTcpHelper{// 静态成员变量&#xff0c;用于存储TcpClient实例private static TcpClient tcpClient null;// 静态成员变量&#xff0c;用于存储ModbusIpMaster实例privat…

一个手机到手机之间通话经过了哪些设备

来源&#xff1a;https://www.bilibili.com/video/BV1ic411F7mM/?spm_id_from333.880.my_history.page.click&vd_source6c5d3cd50fc7fa8732bdfb760a055839 一个手机通话需要经过下面三个网络 类别接入网&#xff08;Access Network&#xff09;承载网&#xff08;Transp…

C语言面试题(持续更新)

1.static/const C语言的关键字 static 修饰 局部变量时 延长了局部变量的生命周期 直到程序结束 作用域取决于定义它的函数 static 修饰 全局变量时 只允许全局变量在定义它的源文件中使用 其他文件不能对其进行调用 static 修饰 函数是 也只允许函数在定义它的源文件中使用…

软件开发者的首选:最佳Bug测试工具Top 10

本篇文章介绍了以下软件bug测试管理工具&#xff1a;PingCode、Worktile、Test360、禅道、码云Gitee、优云测试、Jira、GitHub、Axosoft、Bugzilla。 在开发过程中&#xff0c;Bug的管理往往是最让人头疼的问题之一。小问题积累起来不仅会拖延项目进度&#xff0c;还可能影响到…

【vue】编辑器段落对应材料同步滚动交互

场景需求 编辑器段落对应显示材料编辑器滚动时&#xff0c;材料同步滚动编辑器段落无数据时&#xff0c;材料不显示 实现方法 编辑器与材料组件左右布局获取编辑器高度&#xff0c;材料高度与编辑器高度一致禁用材料组件的滚动事件获取编辑器段落距离顶部的位置&#xff0c;…

三高 vue

高性能是指系统或应用程序在单位时间内能够处理更多的工作量或请求。 高可用性是指系统或服务能够在面对故障或异常情况时保持持续可用和正常运行的能力。 高扩展性是指系统或应用程序能够在面对不断增长的负载时保持性能和吞吐量的能力。 nginx主备keepalived实现nginx服务的高…

Vue 3 watchEffect教程

Vue 3 watchEffect教程 Vue 3 watchEffect教程简介什么是 watchEffect&#xff1f;watchEffect的基本使用引入 watchEffect使用 watchEffect watchEffect的高级用法响应特定响应式状态执行副作用的清理使用 watchEffect 作为响应式引用 watchEffect与Vue 2的watch选项的区别结语…

架站点云自动拼接

southLidar pro 软件里面的架站点云无目标、无传感器的点云自动拼接算法&#xff0c;该算法的特征是速度快&#xff0c;精度高、稳定性高&#xff0c;大部分的场景都能一键自动拼接成功。速度、稳定性&#xff1a;比RealWorks 12、SCENE 2019等软件都快。精度&#xff1a;高于S…

Dart【06】generator生成器函数

什么是生成器函数 Dart生成器函数 (generator) 可以渐进的返回一个值的序列。 Dart内置了两种生成器函数的支持&#xff1a; 同步生成器(sync*)&#xff1a;返回一个Iterable对象。 异步生成器(async*)&#xff1a;返回一个Stream对象。 同步生成器 使用同步生成器修饰的函…

【drools】8.44 例子ubuntu24.04 运行;IntelliJ 修复java: 错误: 不支持发行版本 5

首先是要有jdk 安装:这里是oracle的,不是openjdk ,【ubuntu24.04】安装oracle javasdk– 官方说可以直接跑 root@k8s-master-pfsrv:/home/zhangbin/perfwork/drools/drools-distribution-8.44.0.Final/examples# ./runExamples.sh Usage: ./runExamples.sh For example: .…

python发邮件

1. SMTP&#xff08;简单邮件传输协议&#xff09;基础 SMTP 协议概述 SMTP&#xff08;Simple Mail Transfer Protocol&#xff0c;简单邮件传输协议&#xff09;是用于在计算机网络上传输电子邮件的标准通信协议。它定义了发送邮件的基本规则和流程&#xff0c;确保邮件从发…

LeetCode238.除自身以外数组的乘积

题目大意 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请不要使用除法&#xff0c;且在 O(n)…

视频去模糊技术方案

视频去模糊是一种通过图像处理技术改善视频质量的方法&#xff0c;主要目标是从模糊的视频帧中恢复出清晰的图像。这种模糊可能由多种因素引起&#xff0c;包括相机抖动、快速运动、不良的聚焦机制等。去模糊技术对于提高视频内容的可观赏性和可用性至关重要&#xff0c;尤其是…