目录
2.1 ngx_http_rewrite_module 模块指令
2.1.2 set 指令break 指令 return 指令
一、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 压缩功能
配置指令如下:#启用或禁用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的版本隐藏
[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 自定义变量
Syntax: set $variable value;
Default: —
Context: server, location, if
示例:写子配置文件:
测试:
二、nginx重写功能Rewrite
- Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求
- 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库
- rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能
- 比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问
- 另外还可以在一定程度上提高网站的安全性。
2.1 ngx_http_rewrite_module 模块指令
2.1.1 if 指令
= #比较变量和字符串是否相等,相等时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 指令
rewrite regex replacement [flag];
2.2.3 自动跳转https 全站加密
创建证书密钥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 防盗链
none: #请求报文首部没有referer首部,
#比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked: #请求报文有referer首部,但无有效值,比如为空。
server_names: #referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string: #自定义指定字符串,但可使用*作通配符。示例: *.timinglee.org
www.timinglee.*
regular expression: #被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:
~.*\.timinglee\.com
添加盗链。盗链的网页,在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服务的主机,注意环境哦。
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协议转发至指定服务器处理
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 反向代理负载均衡
3.3.1 http upstream配置参数
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反向代理
测试实现负载均衡。
3.3.2 算法hash
在上面的配置文件里面写。
都调用到一个上面10去
3.3.3 uri进行hash
测试
3.3.4 cookie进行hash
对值进行hash,测试如下
3.4、实现 Nginx 四层负载均衡
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配置指令
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 Nginx与php-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.timezonedate.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 bythis unit.#ProtectSystem=full # 注释该内容#然后启动[root@Nginx php-8.3.9]# systemctl start php-fpm.service[root@Nginx php-8.3.9]# netstat -antlupe | grep phptcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 0820758 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
[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