1、完成nginx编译安装脚本
#!/bin/bash
NGINX_VERSION=1.22.1
#NGINX_VERSION=1.22.0
#NGINX_VERSION=1.20.2
#NGINX_VERSION=1.18.0
NGINX_FILE=nginx-${NGINX_VERSION}.tar.gz
NGINX_URL=http://nginx.org/download/
NGINX_INSTALL_DIR=/apps/nginx
SRC_DIR=/usr/local/src
CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`
. /etc/os-release
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
check () {
[ -e ${NGINX_INSTALL_DIR} ] && { color "nginx 已安装,请卸载后再安装" 1; exit; }
cd ${SRC_DIR}
if [ -e ${NGINX_FILE}${TAR} ];then
color "相关文件已准备好" 0
else
color '开始下载 nginx 源码包' 0
wget ${NGINX_URL}${NGINX_FILE}${TAR}
[ $? -ne 0 ] && { color "下载 ${NGINX_FILE}${TAR}文件失败" 1; exit; }
fi
}
install () {
color "开始安装 nginx" 0
if id nginx &> /dev/null;then
color "nginx 用户已存在" 1
else
useradd -s /sbin/nologin -r nginx
color "创建 nginx 用户" 0
fi
color "开始安装 nginx 依赖包" 0
if [ $ID == "centos" ] ;then
if [[ $VERSION_ID =~ ^7 ]];then
yum -y install gcc make pcre-devel openssl-devel zlib-devel perlExtUtils-Embed
elif [[ $VERSION_ID =~ ^8 ]];then
yum -y install make gcc-c++ libtool pcre pcre-devel zlib zlib-devel
openssl openssl-devel perl-ExtUtils-Embed
else
color '不支持此系统!' 1
exit
fi
elif [ $ID == "rocky" ];then
yum -y install gcc make gcc-c++ libtool pcre pcre-devel zlib zlib-devel
openssl openssl-devel perl-ExtUtils-Embed
else
apt update
apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev
zlib1g-dev
fi
[ $? -ne 0 ] && { color "安装依赖包失败" 1; exit; }
cd $SRC_DIR
tar xf ${NGINX_FILE}
NGINX_DIR=`echo ${NGINX_FILE}| sed -nr 's/^(.*[0-9]).*/\1/p'`
cd ${NGINX_DIR}
./configure --prefix=${NGINX_INSTALL_DIR} --user=nginx --group=nginx --
with-http_ssl_module --with-http_v2_module --with-http_realip_module --withhttp_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream
--with-stream_ssl_module --with-stream_realip_module
make -j $CPUS && make install
[ $? -eq 0 ] && color "nginx 编译安装成功" 0 || { color "nginx 编译安装失败,退 出!" 1 ;exit; }
chown -R nginx.nginx ${NGINX_INSTALL_DIR}
echo "PATH=${NGINX_INSTALL_DIR}/sbin:${PATH}" > /etc/profile.d/nginx.sh
cat > /lib/systemd/system/nginx.service <<EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=${NGINX_INSTALL_DIR}/logs/nginx.pid
ExecStartPre=/bin/rm -f ${NGINX_INSTALL_DIR}/logs/nginx.pid
ExecStartPre=${NGINX_INSTALL_DIR}/sbin/nginx -t
ExecStart=${NGINX_INSTALL_DIR}/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now nginx &> /dev/null
systemctl is-active nginx &> /dev/null || { color "nginx 启动失败,退出!" 1 ;
exit; }
color "nginx 安装完成" 0 }
check
install
exec bash
2、完成nginx平滑升级,总结步骤
平滑升级四个阶段
-
只有旧版nginx的master和worker进程
-
旧版和新版nginx的master和worker进程并存,由旧版nginx接收处理用户的新请求
-
旧版和新版nginx的master和worker进程并存,由新版nginx接收处理用户的新请求
-
只有新版nginx的master和worker进程
#下载最新稳定版 [root@centos8 ~]#wget http://nginx.org/download/nginx-1.20.1.tar.gz [root@centos8 ~]#tar xvf nginx-1.20.1.tar.gz [root@centos8 ~]#cd nginx-1.20.1 #查看当前使用的版本及编译选项。结果如下: [root@centos8 nginx-1.20.1]#/apps/nginx/sbin/nginx -V nginx version: nginx/1.18.0 built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) built with OpenSSL 1.1.1g FIPS 21 Apr 2020 TLS SNI support enabled configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --withhttp_ssl_module --with-http_v2_module --with-http_realip_module --withhttp_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module #configure arguments后面是以前编译时的参数。现在编译使用一样的参数 #开始编译新版本 [root@centos8 nginx-1.20.1]#./configure --prefix=/apps/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 #只执行make,不执行make install [root@centos8 nginx-1.20.1]#make [root@centos8 nginx-1.20.1]#objs/nginx -v nginx version: nginx/1.20.1 #查看两个版本 [root@centos8 nginx-1.20.1]#ll objs/nginx /apps/nginx/sbin/nginx -rwxr-xr-x 1 nginx nginx 7591096 Jun 7 16:28 /apps/nginx/sbin/nginx -rwxr-xr-x 1 root root 7723272 Jun 7 17:27 objs/nginx #把之前的旧版的nginx命令备份 [root@centos8 nginx-1.20.1]#cp /apps/nginx/sbin/nginx /opt/nginx.old #把新版本的nginx命令复制过去覆盖旧版本程序文件,注意:需要加 -f 选项强制覆盖,否则会提示Text file busy [root@centos8 nginx-1.20.1]#cp -f ./objs/nginx /apps/nginx/sbin/ #如果cp 不加-f 选项,会出现下面提示 [root@rocky8 nginx-1.21.6]#cp objs/nginx /apps/nginx/sbin/ cp: overwrite '/apps/nginx/sbin/nginx'? y cp: cannot create regular file '/apps/nginx/sbin/nginx': Text file busy #检测新版本和配置文件语法兼职容性 [root@centos8 nginx1.20.1]#/apps/nginx/sbin/nginx -t #发送信号USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx #此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80 #此时Nginx开启一个新的master进程,且这个新master进程会生成新的worker进程,即升级后的Nginx进程,此时老的进程不会自动退出,新的请求仍由旧进程处理。 [root@centos8 nginx-1.20.1]#kill -USR2 `cat /apps/nginx/logs/nginx.pid` #可以看到两个master,新的master是旧版master的子进程,并生成新版的worker进程 #注意:在Nginx-1.22.1版中如果看不到下面新版进程,需要重新使用service方式重新启动nginx服务再发送USR2信号 [root@centos8 nginx-1.20.1]#ps auxf|grep nginx #先关闭旧nginx的worker进程,而不关闭旧nginx主进程方便回滚 #向原老的Nginx主进程发送WINCH信号,它会平滑关闭老的工作进程(主进程不退出),这时所有新请求都会由新版Nginx处理 [root@centos8 nginx-1.20.1]#kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin` #如果旧版worker进程有用户的旧的请求,会一直等待处理完后才会关闭,即平滑关闭 [root@centos8 nginx-1.20.1]#ps auxf|grep nginx #经过一段时间测试,新版本服务没问题,最后发送QUIT信号,退出老的master,完成全部升级过程 [root@centos8 nginx-1.20.1]#kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin` #查看版本是不是已经是新版了 [root@centos8 nginx-1.20.1]#nginx -v nginx version: nginx/1.20.1
3、总结nginx核心配置,并实现nginx多虚拟主机
3.1 主配置文件结构
main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {
...
}
3.2 全局配置
user nginx nginx;
#启动Nginx工作进程的用户和组
worker_processes [number | auto];
#启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;
#将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,
但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
CPU MASK: 00000001:0号CPU
00000010:1号CPU
10000000:7号CPU
#示例:
worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU
worker_cpu_affinity 1000 0100 0010 0001;
worker_cpu_affinity 0101 1010;
#示例
worker_processes 4;
worker_cpu_affinity 00000010 00001000 00100000 10000000;
[root@centos8 ~]# ps axo pid,cmd,psr | grep nginx
31093 nginx: master process /apps 1
34474 nginx: worker process 1
34475 nginx: worker process 3
34476 nginx: worker process 5
34477 nginx: worker process 7
35751 grep nginx
#auto 绑定CPU
#The special value auto (1.9.10) allows binding worker processes automatically to
available CPUs:
worker_processes auto;
worker_cpu_affinity auto;
#The optional mask parameter can be used to limit the CPUs available for
automatic binding:
worker_cpu_affinity auto 01010101; #错误日志记录配置,语法:error_log file [debug | info | notice | warn | error | crit
| alert | emerg]
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log /apps/nginx/logs/error.log error;
#pid文件保存路径
pid /apps/nginx/logs/nginx.pid;
worker_priority 0; #工作进程优先级,-20~20(19)
worker_rlimit_nofile 65536; #所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例
如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级
别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致,默认不限制
daemon off; #前台运行Nginx服务用于测试、或者以容器运行时,需要设为off
master_process off|on; #是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为
on
events {
worker_connections 65536; #设置单个工作进程的最大并发连接数,默认512,生产建议根据性
能修改更大的值
use epoll; #使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll,只
能设置在events模块中设置。
accept_mutex on; #mutex互斥为on表示同一时刻一个请求轮流由worker进程处理,而防止被同时唤
醒所有worker,避免多个睡眠进程被唤醒的设置,可以避免多个 worker 进程竞争同一连接而导致性能下降,
也可以提高系统的稳定性,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊群",在高并发的场
景下多个worker进程可以各自同时接受多个新的连接请求,如果是多CPU和worker进程绑定,就可以提高吞吐
量
multi_accept on; #on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认
为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on
}
3.3 Http配置块
http {
include mime.types; #导入支持的文件类型,是相对于/apps/nginx/conf的目录
default_type application/octet-stream; #除mime.types中文件类型外,设置其它文件默认
类型,访问其它类型时会提示下载不匹配的类型文件
#日志配置部分
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
#自定义优化参数
sendfile on;
#tcp_nopush on; #开启sendfile的情况下,合并请求后统一发送给客户端,必须开启
sendfile
#tcp_nodelay off; #开启keepalived模式下的连接是否启用TCP_NODELAY选项,为off时,
延迟0.2s发送,默认On时,不延迟发送,立即发送用户响应报文。
#keepalive_timeout 0;
keepalive_timeout 65 65; #设置会话保持时间,第二个值为响应首部:keepAlived:timeout=65,可以和第一个值不同
#gzip on; #开启文件压缩
server {
listen 80 default_server; #设置监听地址和端口,多个虚拟机时当前是否是默认的
虚拟主机,default_server表示是默认主机,否则排在前面server为默认主机
server_name localhost; #设置server name,可以以空格隔开写多个并支持正则表达式,
如:*.wang.com www.wang.* ~^www\d+\.wang\.com$ 示例: .wang.org 相当于
*.wang.org和wang.org
#charset koi8-r; #设置编码格式,默认是俄语格式,建议改为utf-8
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #定义错误页面
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ { #以http的方式转发php请求到指定web服务器
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ { #以fastcgi的方式转发php请求到php处理
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht { #拒绝web形式访问指定文件,如很多的网站都是通过.htaccess文件来
改变自己的重定向等功能。
# deny all;
#}
location ~ /passwd.html {
deny all;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server { #自定义虚拟server
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm; #指定默认网页文件,此指令由
ngx_http_index_module模块提供
# }
#}
# HTTPS server
#
#server { #https服务器配置
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
3.4 实现nginx多虚拟机
3.4.1 PC Web站点
#定义子配置文件路径
[root@centos8 ~]# mkdir /apps/nginx/conf/conf.d
[root@centos8 ~]# vim /apps/nginx/conf/nginx.conf
http {
......
include /apps/nginx/conf/conf.d/*.conf; #在配置文件的最后面添加此行,注意不要放在最前
面,会导致前面的命令无法生效
}#创建PC网站配置
[root@centos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80 default_server;
server_name www.wang.org;
root /data/nginx/html/pc;
}
[root@centos8 ~]# mkdir -p /data/nginx/html/pc
[root@centos8 ~]# echo "pc web" > /data/nginx/html/pc/index.html
[root@centos8 ~]# systemctl reload nginx
#访问测试
3.4.2 Mobile Web站点
[root@centos8 ~]# cat /apps/nginx/conf/conf.d/mobile.conf
server {
listen 80;
server_name m.wang.org; #指定第二个站点名称
root /data/nginx/html/mobile;
}
[root@centos8 ~]# mkdir -p /data/nginx/html/mobile
[root@centos8 ~]# echo "mobile web" >> /data/nginx/html/mobile/index.html
[root@centos8 ~]# systemctl reload nginx
4、总结nginx日志格式定制
4.1 自定义错误日志
server {
listen 80;
server_name www.wang.org;
root /data/www;
location / {
index index.html;
}
#如果出现异常,则重新定向到@error_404这个location上
error_page 404 @error_404;
location @error_404 {
default_type text/html;
charset utf8;
return 200 '你访问的页面可走丢了!';
}
}
4.2 自定义默认格式日志
#注意:此指令只支持http块,不支持server块
log_format access_log_format '$remote_addr - $remote_user [$time_local]
"$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'$server_name:$server_port'; #注意:此指令一定要在放在log_format命令后
access_log logs/access.log access_log_format;
#重启nginx并访问测试日志格式
==> /apps/nginx/logs/access.log <==
10.0.0.1 - - [22/Feb/2019:08:44:14 +0800] "GET /favicon.ico HTTP/1.1" 404 162 "-
" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/2
0100101 Firefox/65.0" "-"www.wang.org:80
4.3 自定义json格式日志
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,' #总的处理时间
'"upstreamtime":"$upstream_response_time",' #后端应用服务器处理时间
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"uri":"$uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';
access_log /apps/nginx/logs/access_json.log access_json;
#重启Nginx并访问测试日志格式,参考链接:http://json.cn/
{"@timestamp":"2019-02-
22T08:55:32+08:00","host":"10.0.0.8","clientip":"10.0.0.1","size":162,"responset
ime":0.000,"upstreamtime":"-","upstreamhost":"-
","http_host":"www.wang.org","uri":"/favicon.ico","xff":"-","referer":"-
","tcp_xff":"","http_user_agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64;
rv:65.0) Gecko/20100101 Firefox/65.0","status":"404"}
4.3 不记录访问日志
#请求 favicon.ico 时,不记录日志
location /favicon.ico {
access_log off;
return 200; }#当有人访问gif、png等资源时,将日志丢入空
location ~* .*\.(gif|jpg|png|css|js)$ {
access_log /dev/null;
}
5、总结 nginx反向代理及https安全加密
反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。
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协议转发至指定服务器处理
Https加密
Web网站的登录页面通常都会使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
https 实现过程如下:
1.客户端发起HTTPS请求:
客户端访问某个web端的https地址,一般都是443端口
2.服务端的配置:
采用https协议的服务器必须要有一套证书,可以通过一些组织申请,也可以自己制作,目前国内很多网站都
自己做的,当你访问一个网站的时候提示证书不可信任就表示证书是自己做的,证书就是一个公钥和私钥匙,
就像一把锁和钥匙,正常情况下只有你的钥匙可以打开你的锁,你可以把这个送给别人让他锁住一个箱子,里
面放满了钱或秘密,别人不知道里面放了什么而且别人也打不开,只有你的钥匙是可以打开的。
3.传送证书:
服务端给客户端传递证书,其实就是公钥,里面包含了很多信息,例如证书得到颁发机构、过期时间等等。
4.客户端解析证书:
这部分工作是有客户端完成的,首先回验证公钥的有效性,比如颁发机构、过期时间等等,如果发现异常则会
弹出一个警告框提示证书可能存在问题,如果证书没有问题就生成一个随机值,然后用证书对该随机值进行加
密,就像2步骤所说把随机值锁起来,不让别人看到。
5.传送4步骤的加密数据:
就是将用证书加密后的随机值传递给服务器,目的就是为了让服务器得到这个随机值,以后客户端和服务端的
通信就可以通过这个随机值进行加密解密了。
6.服务端解密信息:
服务端用私钥解密5步骤加密后的随机值之后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进
行对称加密,对称加密就是将信息和私钥通过算法混合在一起,这样除非你知道私钥,不然是无法获取其内部
的内容,而正好客户端和服务端都知道这个私钥,所以只要机密算法够复杂就可以保证数据的安全性。
7.传输加密后的信息:
服务端将用私钥加密后的数据传递给客户端,在客户端可以被还原出原数据内容。
8.客户端解密信息:
客户端用之前生成的私钥获解密服务端传递过来的数据,由于数据一直是加密的,因此即使第三方获取到数据
也无法知道其详细内容。
# 6、实验完成基于LNMP和Redis的phpmyadmin的会话保持,记录完整步骤
## 6.1 **准备** **MySQL** **和** **Redis**
```sh
[root@ubuntu2004 ~]#apt -y install mysql-server redis
#配置可不修改
[root@ubuntu2004 ~]#vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
[root@ubuntu2004 ~]#systemctl restart mysql
#创建用户并授权
[root@ubuntu2004 ~]#mysql
mysql> create user admin@'localhost' identified with mysql_native_password by
'123456';
mysql> grant all on *.* to admin@'localhost';
6.2 编译安装 PHP-7.4 和 PHP-Redis 模块
[root@ubuntu2004 ~]#apt -y install gcc make autoconf libpcre3 libpcre3-dev
openssl libssl-dev zlib1g-dev libxml2-dev pkg-config libsqlite3-dev libtool
[root@ubuntu2004 ~]#groupadd -g 80 www && useradd -u 80 -g www www
#编译oniguruma
[root@ubuntu2004 ~]#wget -O oniguruma-6.9.4.tar.gz
https://github.com/kkos/oniguruma/archive/refs/tags/v6.9.4.tar.gz
[root@ubuntu2004 ~]#tar xf oniguruma-6.9.4.tar.gz
[root@ubuntu2004 oniguruma-6.9.4]#./autogen.sh
[root@ubuntu2004 oniguruma-6.9.4]#./configure && make && make install
#编译PHP7.4
[root@ubuntu2004 ~]#wget https://www.php.net/distributions/php-7.4.30.tar.gz
[root@ubuntu2004 ~]#tar xf php-7.4.30.tar.gz
[root@ubuntu2004 ~]#cd ../php-7.4.30
[root@ubuntu2004 php-7.4.30]#./configure --prefix=/apps/php --enable-mysqlnd --
with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --with-zlib --
with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --enablembstring --enable-xml --enable-sockets --enable-fpm --enable-maintainer-zts --
disable-fileinfo
[root@ubuntu2004 php-7.4.30]#make -j 2 && make install
#查看版本验证编译成功
[root@ubuntu2004 ~]#/apps/php/sbin/php-fpm -v
PHP 7.4.30 (fpm-fcgi) (built: Sep 18 2022 18:27:30)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
#编译php-redis
[root@ubuntu2004 ~]#wget https://pecl.php.net/get/redis-5.3.7.tgz
[root@ubuntu2004 ~]#tar xf redis-5.3.7.tgz
[root@ubuntu2004 ~]#cd redis-5.3.7/
[root@ubuntu2004 redis-5.3.7]#/apps/php/bin/phpize && ./configure --with-phpconfig=/apps/php/bin/php-config && make -j 2 && make install
[root@ubuntu2004 redis-5.3.7]#ls /apps/php/lib/php/extensions/no-debug-zts-
20190902
opcache.a opcache.so redis.so
[root@ubuntu2004 redis-5.3.7]#cd /root/php-7.4.30/
[root@ubuntu2004 php-7.4.30]#cp php.ini-production /etc/php.ini
[root@ubuntu2004 php-7.4.30]#cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@ubuntu2004 php-7.4.30]#chmod +x /etc/init.d/php-fpm
[root@ubuntu2004 php-7.4.30]#cd /apps/php/etc/
[root@ubuntu2004 etc]#cp php-fpm.conf.default php-fpm.conf
[root@ubuntu2004 etc]#cp php-fpm.d/www.conf.default php-fpm.d/www.conf
[root@ubuntu2004 ~]#vim /etc/php.ini
date.timezone = Asia/Shanghai
post_max_size = 8M
upload_max_filesize = 100M
display_errors = On
error_log = syslog
;extension=/apps/php/lib/php/extensions/no-debug-zts-20190902/redis.so #不写路径
也可以
extension=redis.so
[root@ubuntu2004 ~]#vim /apps/php/etc/php-fpm.d/www.conf
user = www
group = www
listen = 127.0.0.1:9000
pm.status_path = /php-status
ping.path = /ping
access.log = log/$pool.access.log
slowlog = log/$pool.log.slow
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://127.0.0.1:6379" #指定Redis地址
#创建访问日志文件路径
[root@ubuntu2004 ~]#mkdir /apps/php/log
[root@ubuntu2004 ~]#systemctl daemon-reload
[root@ubuntu2004 ~]#systemctl enable php-fpm.service
#启动php-fpm
[root@ubuntu2004 ~]#systemctl start php-fpm
#或者直接运行程序也可以,默认是后台运行
[root@ubuntu2004 ~]#/apps/php/sbin/php-fpm
#验证服务启动
[root@ubuntu2004 ~]#ss -ntlp|grep 9000
LISTEN 0 511 127.0.0.1:9000 0.0.0.0:*
users:(("php-fpm",pid=154390,fd=6),("php-fpm",pid=154389,fd=6),("phpfpm",pid=154388,fd=8))
[root@ubuntu2004 ~]#ps aux|grep php
root 154388 0.0 0.2 62812 4920 ? Ss 19:45 0:00 php-fpm:
master process (/apps/php/etc/php-fpm.conf)
www 154389 0.0 1.3 74556 27172 ? S 19:45 0:02 php-fpm: pool
www
www 154390 0.0 0.9 67344 19012 ? S 19:45 0:02 php-fpm: pool
www
root 157770 0.0 0.0 9392 724 pts/0 S+ 20:43 0:00 grep --
color=auto php
6.3 编译安装 Nginx
[root@ubuntu2004 ~]#wget http://nginx.org/download/nginx-1.22.0.tar.gz
[root@ubuntu2004 ~]#tar xf nginx-1.22.0.tar.gz
[root@ubuntu2004 ~]#cd nginx-1.22.0/
[root@ubuntu2004 nginx-1.22.0]#./configure --prefix=/apps/nginx --user=www --
group=www --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@ubuntu2004 nginx-1.22.0]#make -j 2 && make install
[root@rocky8 ~]#mkdir /apps/nginx/conf.d/
#准备配置文件
[root@rocky8 ~]#vim /apps/nginx/conf/nginx.conf
user www; #修改此行
http {
....
include /apps/nginx/conf.d/*.conf; #添加此行
}#配置nginx支持php
[root@ubuntu2004 ~]#vim /apps/nginx/conf.d/www.wang.org.conf
server {
listen 80;
server_name www.wang.org;
root /data/www/;
index index.php;
client_max_body_size 20m;
location ~ \.php$|/ping|/php-status {
root /data/www/;
fastcgi_pass 127.0.0.1:9000 ;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
include fastcgi_params;
}
}
[root@ubuntu2004 ~]#cat > /lib/systemd/system/nginx.service <<EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStartPre=/bin/rm -f /apps/nginx/logs/nginx.pid
ExecStartPre=/apps/nginx/sbin/nginx -t
ExecStart=/apps/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
EOF
[root@ubuntu2004 ~]#systemctl daemon-reload
[root@ubuntu2004 ~]#systemctl enable --now nginx
6.4 测试访问PHP
[root@ubuntu2004 ~]#mkdir /data/www -p
#测试访问
[root@ubuntu2004 ~]#vim /data/www/test.php
<?php
phpinfo();
?>
#在客户端实现名称解析,也可以配置DNS实现
[root@ubuntu2004 ~]#vim /etc/hosts
10.0.0.100 www.wang.org
#访问下面查看是否成功
http://www.wang.org/ping
http://www.wang.org/php-status
http://www.wang.org/test.php
6.5 准备 phpMyAdmin 程序
[root@ubuntu2004 ~]#wget
https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.zip
[root@ubuntu2004 ~]#unzip phpMyAdmin-5.2.0-all-languages.zip
[root@ubuntu2004 ~]#mv phpMyAdmin-5.2.0-all-languages/* /data/www
[root@ubuntu2004 ~]#cp /data/www/config.sample.inc.php config.inc.php
[root@ubuntu2004 ~]#vim /data/www/config.inc.php
$cfg['Servers'][$i]['host'] = '127.0.0.1'; #本机也必须改为127.0.0.1,否则会出现错
误:mysqli::real_connect(): (HY000/2002): No such file or directory
[root@ubuntu2004 ~]#chown -R www.www /data/www/
6.6 测试访问网站
[root@ubuntu2004 ~]#redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:ee7bn6eu6orjn1ajt9j9d06s6c"
127.0.0.1:6379> type "PHPREDIS_SESSION:ee7bn6eu6orjn1ajt9j9d06s6c"
string
127.0.0.1:6379> get "PHPREDIS_SESSION:ee7bn6eu6orjn1ajt9j9d06s6c"