企业nginx 详解!!!之(高级配置、企业实用功能最详细)

目录

一、nginx 高级配置

1.1 nginx 状态页

 1.2 nginx 压缩功能

1.3 Nginx的版本隐藏

1.4 变量使用

1.4.1  内置变量

1.4.2 自定义变量

 二、nginx重写功能Rewrite

2.1 ngx_http_rewrite_module 模块指令

2.1.1 if 指令

2.1.2 set 指令break 指令 return 指令

2.2  rewrite 指令

2.2.3 自动跳转https 全站加密 

2.2.4 判断文件是否存在--报错机制

2.3 Nginx 防盗链

三、nginx反向代理功能 

 3.1 实现 http 反向代理

​编辑 3.1.2缓存功能

 3.3 http 反向代理负载均衡

3.3.1 http upstream配置参数

​编辑3.3.2 算法hash

 3.3.3 uri进行hash

 3.3.4 cookie进行hash

 3.4、实现 Nginx 四层负载均衡

3.4.1使用dns 实现负载均衡

3.4.2 使用MySQL实现负载均衡

3.5  实现 FastCGI

 3.5.1FastCGI配置指令

3.5.2 Nginx与php-fpm在同一服务器

1、源码部署nginx

2、源码部署nginx

3、php相关配置优化

 4、写子配置文件及测试页面

 3.5.3 php缓存----memcache

 1. 安装memcache模块

3、配置php加载memcache模块

4、部署memcached

 3.5.4加上nginx,实现php高速缓存


一、nginx 高级配置

1.1 nginx 状态页

  • 基于nginx 模块 ngx_http_stub_status_module 实现,
  • 在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module
  • 否则配置完成之后监测会是提示法错误

 注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态

# 配置示例:
location /nginx_status {
stub_status;
auth_basic "auth login";
auth_basic_user_file /apps/nginx/conf/.htpasswd;
allow 192.168.0.0/16;
allow 127.0.0.1;
deny all;
}

# 状态页用于输出 nginx 的基本状态信息:
# 输出信息示例
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
上面三个数字分别对应accepts,handled,requests三个值
Reading: 6 Writing: 179 Waiting: 106
Active connections: #当前处于活动状态的客户端连接数
#包括连接等待空闲连接数=reading+writing+waiting
accepts: #统计总值,Nginx自启动后已经接受的客户端请求连接的总数。
handled: #统计总值,Nginx自启动后已经处理完成的客户端请求连接总数
#通常等于accepts,除非有因worker_connections限制等被拒绝的
连接
requests: #统计总值,Nginx自启动后客户端发来的总的请求数
Reading: #当前状态,正在读取客户端请求报文首部的连接的连接数
#数值越大,说明排队现象严重,性能不足
Writing: #当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明
访问量很大
Waiting: #当前状态,正在等待客户端发出请求的空闲连接数
开启 keep-alive的情况下,这个值等于active –
(reading+writing)

 1.2 nginx 压缩功能

Nginx支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的 IT支出,不过会占用相应的 CPU 资源。
Nginx 对文件的压缩功能是依赖于模块 ngx_http_gzip_module, 默认是内置模块
配置指令如下:
#启用或禁用gzip压缩,默认关闭
gzip on | off;
#压缩比由低到高从1到9,默认为1,值越高压缩后文件越小,但是消耗cpu比较高。基本设定未4或者5
gzip_comp_level 4;
#禁用IE6 gzip功能,早期的IE6之前的版本不支持压缩
gzip_disable "MSIE [1-6]\.";
#gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
#启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_http_version 1.0 | 1.1;
#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;
gzip_buffers number size;
#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
gzip_types mime-type ...;
#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_vary on | off;
#预压缩,即直接从磁盘找到对应文件的gz后缀的式的压缩文件返回给用户,无需消耗服务器CPU
#注意: 来自于ngx_http_gzip_static_module模块
gzip_static on | off;

示例:在主配置文件中写,以下内容。

创建目录

[root@nginx-node1 ~]# echo hello haha > /data/web/html/small.html

[root@nginx-node1 ~]# cat /usr/local/nginx/logs/access.log  > /data/web/html/big.html

然后测试访问成功,注意每次都要重启

1.3 Nginx的版本隐藏

用户在访问 nginx 的时候,我们可以从报文中获得 nginx 的版本,相对于裸漏版本号的 nginx,我们把其隐藏起来更安全
[root@Nginx nginx-1.26.1]# vim src/core/nginx.h
#define nginx_version 1026001
#define NGINX_VERSION "1.0"
#define NGINX_VER "HAHA/" NGINX_VERSION

1.4 变量使用

  • nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用
  • 变量可以分为内置变量和自定义变量
  • 内置变量是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值。

1.4.1  内置变量

常用内置变量

$remote_addr;
#存放了客户端的地址,注意是客户端的公网IP
$args;
#变量中存放了URL中的所有参数
#例如:https://search.jd.com/Search?keyword=手机&enc=utf-8
#返回结果为: keyword=手机&enc=utf-8
$is_args
#如果有参数为? 否则为空
$document_root;
#保存了针对当前资源的请求的系统根目录,例如:/webdata/nginx/timinglee.org/lee。
$document_uri;
#保存了当前请求中不包含参数的URI,注意是不包含请求的指令
#比如:http://lee.timinglee.org/var?\id=11111会被定义为/var
#返回结果为:/var
$host;
#存放了请求的host名称
limit_rate 10240;
echo $limit_rate;
#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0
$remote_port;
#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口
$remote_user;
#已经经过Auth Basic Module验证的用户名
$request_body_file;
#做反向代理时发给后端服务器的本地资源的名称
$request_method;
#请求资源的方式,GET/PUT/DELETE等
$request_filename;
#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,
#如:webdata/nginx/timinglee.org/lee/var/index.html
$request_uri;
#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,
#例如:/main/index.do?id=20190221&partner=search
$scheme;
#请求的协议,例如:http,https,ftp等
$server_protocol;
#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等
$server_addr;
#保存了服务器的IP地址
$server_name;
#虚拟主机的主机名
$server_port;
#虚拟主机的端口号
$http_user_agent;
#客户端浏览器的详细信息
$http_cookie;
#客户端的所有cookie信息
$cookie_<name>
#name为任意请求报文首部字部cookie的key名
$http_<name>
#name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有
横线需要替换为下划线


#示例:
echo $http_user_agent;
echo $http_host;
$sent_http_<name>
#name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有
问题
echo $sent_http_server;
$arg_<name>
#此变量存放了URL中的指定参数,name为请求url中指定的参数
echo $arg_id;

1.4.2 自定义变量

假如需要自定义变量名称和值,使用指令 set $variable value;
Syntax: set $variable value;
Default: —
Context: server, location, if

示例:写子配置文件:

 测试:

 二、nginx重写功能Rewrite

  • Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求
  • 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE
  • rewritenginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能
  • 比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问
  • 另外还可以在一定程度上提高网站的安全性。

2.1 ngx_http_rewrite_module 模块指令

2.1.1 if 指令

用于条件匹配判断,并根据条件判断结果选择不同的 Nginx 配置,可以配置在 server location块中进行配置, Nginx if 语法仅能使用 if 做单次判断,不支持使用 if else 或者 if elif这样的多重判断
 
使用正则表达式对变量进行匹配,匹配成功时 if 指令认为条件为 true ,否则认为 false,变量与表达式之间使用以下符号链接:
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false

示例:

location /test {
    index index.html;
    default_type text/html;
    if ( $scheme = http ){
        echo "if ---------> $scheme";
    }
    if ( $scheme = https ){
        echo "if ---------> $scheme";
    }
    }
    location /test2 {
    if ( !-e $request_filename ){
        echo "$request_filename is not exist";
        return 409;
    }
}
测试:
[root@client ~]# curl lee.timinglee.org/test/
if ---------> http
[root@client ~]# curl lee.timinglee.org/test2/test
/webdata/nginx/timinglee.org/lee/test2/test is not exist

2.1.2 set 指令break 指令 return 指令

set: 
指定 key 并给其定义一个变量,变量可以调用 Nginx 内置变量赋值给 key
另外 set 定义格式为 set $key value value 可以是 text, variables 和两者的组合。
break 指令
用于中断当前相同作用域 (location) 中的其他 Nginx 配置
与该指令处于同一作用域的 Nginx 配置中,位于它前面的配置生效
位于后面的 ngx_http_rewrite_module 模块中指令就不再执行
Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在 server 块和 locationif 块中使用
注意 : 如果 break 指令在 location 块中后续指令还会继续执行 , 只是不执行 ngx_http_rewrite_module 模块的指令 , 其它指令还会执行
return 指令
return 用于完成对请求的处理,并直接向客户端返回响应状态码,比如 : 可以指定重定向 URL(对于特殊重 定向状态码, 301/302 ) 或者是指定提示文本内容 ( 对于特殊状态码 403/500 ),处于此指令后的所有配 置都将不被执行, return 可以在 server if location 块进行配置
return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容
#可以调用变量,其中text如果有空格,需要用单或双引号
return code URL; #返回给客户端的URL地址

2.2  rewrite 指令

通过正则表达式的匹配来改变 URI ,可以同时存在一个或多个指令,按照顺序依次对 URI进行匹配, rewrite 主要是针对用户请求的 URL 或者是 URI 做具体处理
rewrite regex replacement [flag];

2.2.3 自动跳转https 全站加密 

案例:基于通信安全考虑公司网站要求全站 https ,因此要求将在不影响用户请求的情况下将 http请求全 部自动跳转至 https ,另外也可以实现部分 location 跳转
创建证书密钥
cd /usr/local/nginx/
mkdir certs
openssl req  -newkey  rsa:2048 -nodes -sha256 -keyout /usr/local/nginx/certs/timinglee.org.key \
-x509  -days 365 -out /usr/local/nginx/certs/timinglee.org.crt
vim /usr/local/nginx/conf.d/vhosts.conf

写子配置文件:pc.conf

server {
    listen 443 ssl;
    listen 80;
    ssl_certificate /apps/nginx/certs/www.timinglee.org.crt;
    ssl_certificate_key /apps/nginx/certs/www.timinglee.org.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    server_name www.timniglee.org;
    location / { #针对全站跳转
        root /data/nginx/html/pc;
        index index.html;
        if ($scheme = http ){ #如果没有加条件判断,会导致死循环
        rewrite / https://$host redirect;
        }
    }
    location /login { #针对特定的URL进行跳转https
        if ($scheme = http ){ #如果没有加条件判断,会导致死循环
        rewrite / https://$host/login redirect;
        }
    }
}

重启测试:

#重启Nginx并访问测试
[root@centos7 ~]#curl -ikL www.timinglee.org
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.18.0
Date: Thu, 08 Oct 2020 15:23:48 GMT
Content-Type: text/html
Content-Length: 145
Connection: keep-alive
Location: https://www.magedu.org
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Thu, 08 Oct 2020 15:23:48 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Sat, 26 Sep 2020 01:18:32 GMT
Connection: keep-alive
ETag: "5f6e96e8-7"
Accept-Ranges: bytes
pc web

2.2.4 判断文件是否存在--报错机制

案例:当用户访问到公司网站的时输入了一个错误的URL,可以将用户重定向至官网首页

location / {
    root /data/nginx/html/pc;
    index index.html;
    if (!-e $request_filename) {
    rewrite .* http://www.timinglee.org/index.html; #实现客户端浏览器的302跳转
    #rewrite .* /index.html; #web服务器内部跳转
    }
}

2.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
在一个 web 站点盗链另一个站点的资源信息,比如 : 图片、视频等,这里需要另开一台虚拟机web10(172.25.254.10)做web服务。
添加盗链。

盗链的网页,在web10上写。

# 重启 apache 并访问 http://172.25.254.10 测试
#验证两个域名的日志,是否会在被盗连的web站点的日志中出现以下盗链日志信息:
[root@Nginx ~]# cat /usr/local/nginx/logs/access.log
172.25.254.1 - - [22/Jul/2024:09:50:01 +0800] "GET /images/logo.png HTTP/1.1" 304
0 "http://172.25.254.20/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Edg/126.0.0.0"
172.25.254.1 - - [22/Jul/2024:09:50:18 +0800] "GET / HTTP/1.1" 304 0
"http://172.25.254.20/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Edg/126.0.0.0"

三、nginx反向代理功能 

环境准备:

需要另开两台虚拟机web1(172.25.254.10),web2(172.25.254.20)使用httpd服务.注意之前已经有了一台作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,等等,这种访问资源需要经过处理才能被访问

 

 3.1 实现 http 反向代理

将web2的http配置文件中的监听80改成8080.

然后nginx子配置文件添加反向代理

重启测试访问:

 

 3.1.2缓存功能

缓存功能默认关闭状态 , 需要先动配置才能启用
proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义

proxy_cache_key string;
#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;

proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时长,定义在http{...}中
    示例:
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;
proxy_cache_path;
#定义可用于proxy功能的缓存;Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_zone=zone_name:size [inactive=time] [max_size=size] [manager_files=number]
[manager_sleep=time] [manager_threshold=time] [loader_files=number]
[loader_sleep=time] [loader_threshold=time] [purger=on|off]
[purger_files=number] [purger_sleep=time] [purger_threshold=time];
#示例:在http配置定义缓存信息
proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
levels=1:2:2 #定义缓存目录结构层次
#1:2:2可以生成
2^4x2^8x2^8=2^20=1048576个目录
keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata
(如:使用次数)
#一般1M可存放8000个左右的key
inactive=120s #缓存有效时间
max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 1m; #除指定的状态码返回的数据以外的缓存多长时间,必须设置,
否则不会缓存
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 |
http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默认是off
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端
#示例
proxy_cache_use_stale error http_502 http_503;
proxy_cache_methods GET | HEAD | POST ...;
#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存

在web20上先进行压测

ab -n1000 -c100 http://www.timinglee.org/static/index.html

在主配置文件中添加缓存

编写子配置文件

然后验证缓存目录结构

#/usr/local/nginx/proxycache/ 目录会自动生成
[root@Nginx ~]# ll /usr/local/nginx/proxycache/ -d
drwx------ 3 nginx root 4096 7月 25 20:07 /usr/local/nginx/proxycache/
[root@Nginx ~]# tree /usr/local/nginx/proxycache/
/usr/local/nginx/proxycache/
0 directories, 0 files

 3.3 http 反向代理负载均衡

在上一个节中 Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而 且不能对后端服务器提供相应的服务器状态监测, Nginx 可以基于 http_upstream_module模块提 供服务器分组转发、权重分配、状态监测、调度算法等高级功能

3.3.1 http upstream配置参数

示例: 后端多台 web 服务器
环境说明:
172.25.254.100 #Nginx 代理服务器
172.25.254.10 #后端web A,Apache部署
172.25.254.20 #后端web B,Apache部署

部署后端 :

[root@web10 ~]# yum install httpd -y
[root@web10 ~]# echo "web1 172.25.254.10" > /var/www/html/index.html
[root@web10 ~]# systemctl enable --now httpd
[root@web20 ~]# yum install httpd -y
[root@web20 ~]# echo "web2 172.25.254.20" >> /var/www/html/index.html
[root@web20 ~]# systemctl enable --now httpd
#访问测试
[root@nginx ~]# curl http://172.25.254.10
web1 172.25.254.10
[root@nginx ~]# curl http://172.25.254.20
web2 172.25.254.20

配置nginx反向代理

注意 : 本节实验过程中先关闭缓存
写子配置文件:fx.conf

测试实现负载均衡。

3.3.2 算法hash

在上面的配置文件里面写。

 都调用到一个上面10去

 3.3.3 uri进行hash

 测试

 3.3.4 cookie进行hash

 对值进行hash,测试如下

 3.4、实现 Nginx 四层负载均衡

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

3.4.1使用dns 实现负载均衡

在web1,web2上面先部署dns.

在web1上:

编辑dns主配置文件

[root@web1 ~]# vim /etc/named.conf

[root@web1 named]# vim /etc/named.rfc1912.zones

[root@web1 named]# cp named.localhost haha1.zone -p

重启dns服务,并能正常解析。

[root@web1 named]# systemctl start named

 

web2上:

然后将10下的文件复制到20上面去:

scp -p /etc/named.{conf,rfc1912.zones} root@172.25.254.20:/etc/

[root@web1 ~]# scp -p /var/named/haha1.zone  root@172.25.254.20:/var/named/haha1.zone

要修改一下20

修改目录组权限

重启解析:

nginx:

然后在nginx主配置文件里面重新写tcp子配置文件。注意要在http模块外面。

include  "/usr/local/nginx/tcpconf.d/*.conf";

注意要创建子配置文件目录 mkdir -p /usr/local/nginx/tcpconf.d

写一个子配置文件dns.conf

[root@nginx-node1 ~]# cat dns.conf
stream {
	upstream dns {
		server 172.25.254.10:53 fail_timeout=15s max_fails=3;
		server 172.25.254.20:53 fail_timeout=15s max_fails=3;

	}
	server {
		listen 53 udp reuseport;
		proxy_timeout 20s;
		proxy_pass dns;
	}

}
[root@nginx-node1 ~]# nginx -s reload

然后在nginx上能够通过dns解析负载均衡

3.4.2 使用MySQL实现负载均衡

#下载mariadb服务

[root@web1 ~]# dnf install mariadb-server -y

[root@web2 ~]# dnf install mariadb-server -y

#添加id区分

[root@web1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf

[root@web2 ~]# vim /etc/my.cnf.d/mariadb-server.cnf

[root@web1 ~]# systemctl start mariadb

[root@web2 ~]# systemctl start mariadb

#然后要授权,两台登录数据库,输入下面命令进行用户授权。

ariaDB [(none)]> create USER lee@'%' identified by 'lee';

Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> grant ALL ON *.* to lee@'%';

Query OK, 0 rows affected (0.001 sec)

写子配置文件就在上面的dns.conf中写,添加如下标红部分。

然后在nginx服务器上测试,实现负载均衡。

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

 3.5.1FastCGI配置指令

Nginx 基于模块 ngx_http_fastcgi_module 实现通过 fastcgi 协议将指定的客户端请求转发至 php-fpm处理,其配置指令如下:
fastcgi_pass address:port;
#转发请求到后端服务器,address为后端的fastcgi server的地址,可用位置:location, if in
location
fastcgi_index name;
#fastcgi默认的主页资源,示例:fastcgi_index index.php;
fastcgi_param parameter value [if_not_empty];
#设置传递给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义
key
fastcgi_param REMOTE_ADDR $remote_addr; #客户端源IP
fastcgi_param REMOTE_PORT $remote_port; #客户端源端口
fastcgi_param SERVER_ADDR $server_addr; #请求的服务器IP地址
fastcgi_param SERVER_PORT $server_port; #请求的服务器端口
fastcgi_param SERVER_NAME $server_name; #请求的server name
Nginx默认配置示例:
location ~ \.php$ {
root /scripts;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; #默认脚本路径
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; #此文件默认系统已提供,存放的相对路径为
prefix/conf
}

3.5.2 Nginxphp-fpm在同一服务器

1、源码部署nginx

先删掉之前的nginx,需要一个全新的环境。

切换到nginx-1.26.2上面,进行编译

./configure --prefix=/usr/local/nginx --add-module=/root/echo-nginx-module-0.63 --add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module-0.33 --user=nginx --group=nginx --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-pcre

要make & makeinstall

杀死之前的nginx,启动nginx,

killall -9 nginx
systemctl start nginx
2、源码部署nginx

下载php8.3.9.tar.gz并解压,切换到目录下。

首先:安装依赖包:

[root@Nginx ~]# yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel
libpng-devel libcurl-devel oniguruma-devel


#注意oniguruma-devel可能没有这个包,需要我们自己去下,这里我把地址放在下面,直接wget就行了
https://mirrors.aliyun.com/rockylinux/9.4/devel/x86_64/kickstart/Packages/o/oniguruma-devel-6.9.6-1.el9.5.x86_64.rpm

然后就去编译就行了

#编译
[root@nginx-node1 php-8.3.9]# ./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-pdo-mysql --disable-debug --enable-sockets --enable-soap --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring --enable-bcmath --with-fpm-systemd

编译成功界面如下:

然后 make && make install,进行安装,成功界面如下:

3、php相关配置优化

# 复制

[root@Nginx ~]# cd /usr/local/php/etc
[root@Nginx etc]# cp php-fpm.conf.default php-fpm.conf
[root@Nginx etc]# vim php-fpm.conf
#去掉注释
pid = run/php-fpm.pid # 指定 pid 文件存放位置
#将配置文件复制过来,但不修改内容
[root@Nginx etc]# cd php-fpm.d/
[root@Nginx php-fpm.d]# cp www.conf.default www.conf
## 生成主配置文件
[root@Nginx php-fpm.d]# cd /root/php-8.3.9/
[root@Nginx php-8.3.9]# cp php.ini-production /usr/local/php/etc/php.ini
[root@Nginx ~]# vim /usr/local/php/etc/php.ini
[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
date.timezone = Asia/Shanghai # 修改时区
# 生成启动文件
[root@Nginx ~]# cd /root/php-8.3.9/
[root@Nginx php-8.3.9]# cp sapi/fpm/php-fpm.service /lib/systemd/system/
# Mounts the /usr, /boot, and /etc directories read-only for processes invoked by
this unit.
#ProtectSystem=full # 注释该内容
#然后启动
[root@Nginx php-8.3.9]# systemctl start php-fpm.service
[root@Nginx php-8.3.9]# netstat -antlupe | grep php
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 0
820758 176202/php-fpm: mas
 4、写子配置文件及测试页面

测试页面:

vim /data/web/php/index.php

<?php
phpinfo();
?>

 子配置页面:

[root@Nginx ~]# vim /usr/local/nginx/conf.d/php.conf
server {
    listen 80;
    server_name www.timinglee.org;
    root /data/web/html;
    index index.html
    location ~ \.php$ {
    root /data/web/php;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi.conf;
    }
}
#重启Nginx并访问web测试
[root@Nginx ~]# nginx -s reload

重启php,要使用systemctl来启动,要将其放入环境变量中,这里就不细说了,之前上面已经说过了,不知道的可以去看之前的哦

systemctl restart php-fpm.service

测试:

 3.5.3 php缓存----memcache

 1. 安装memcache模块
[root@Nginx ~]# tar zxf memcache-8.2.tgz
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# yum install autoconf
[root@Nginx memcache-8.2]# phpize
[root@Nginx memcache-8.2]# ./configure && make && make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-nonzts-20230831/
[root@Nginx memcache-8.2]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-
20230831/
memcache.so opcache.so
2、复制测试文件到 nginx 发布目录中 
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# ls
autom4te.cache config.log configure.ac example.php Makefile.fragments
README
build config.m4 config.w32 include Makefile.objects runtests.php
config9.m4 config.nice CREDITS libtool memcache.la src
config.h config.status docker LICENSE memcache.php
tests
config.h.in configure Dockerfile Makefile modules
[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','lee'); // 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
3、配置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
4、部署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"

测试:

访问 http://php.timinglee.org/example.php 不断刷新
访问 http://php.timinglee.org/memcache.php 查看命中效果

 

 

刷新了example.php。

memcache去缓存php数据,取出php的内容

 

 3.5.4加上nginx,实现php高速缓存

修改子配置文件vhost.conf连接memcache

通过压测example.php 

[root@nginx-node1 conf.d]# ab -n500 -c10 http://www.haha.com/example.php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左水水%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值