2024第十周

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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值