第十周

第十周

  1. 完成nginx编译安装脚本
    #!/bin/bash
     
    NGINX_VERSION=1.22.1
    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 perl-ExtUtils-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 --with-http_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}
         ln -s ${NGINX_INSTALL_DIR}/sbin/nginx /usr/local/sbin/nginx
         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
    
  2. 完成nginx平滑升级,总结步骤
    [root@ubuntu2004 ~]rz -E
    [root@ubuntu200406 ~]ls
    nginx-1.22.1  nginx-1.22.1.tar.gz  nginx-1.24.0.tar.gz  snap
    [root@ubuntu2004 ~]tar xf nginx-1.24.0.tar.gz
    [root@ubuntu2004 ~]ls
    nginx-1.22.1  nginx-1.22.1.tar.gz  nginx-1.24.0  nginx-1.24.0.tar.gz  snap
    [root@ubuntu2004 ~]cd nginx-1.24.0/
    [root@ubuntu2004 nginx-1.24.0]ls
    auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
    #查看当前使用的版本及编译选项。结果如下:
    [root@ubuntu2004 nginx-1.24.0]nginx -V
    nginx version: nginx/1.22.1
    built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
    built with OpenSSL 1.1.1f  31 Mar 2020
    TLS SNI support enabled
    configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --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_modul
    
  3. 总结nginx核心配置,并实现nginx多虚拟主机

    可以实现在一台服务器虚拟出多个网站。

子配置文件添加虚拟主机,在Nginx主配置文件nginx.conf中的http功能语句块内添加includ字段

include /apps/nginx/conf/conf.d/*.conf;

基于域名的多虚拟主机配置流程
server {
    # 定义网站端口的参数
    listen       80;
    # 填写网站域名的参数
    server_name  www.test1.com;
    #charset koi8-r;
    #access_log  logs/host.access.log  main;
    #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;
    location / {
        # root关键词定义的是 网页根目录的路径
        root   /tmp/test/test1;
        # index参数 定义的是首页文件的名字
        index  index.html index.htm;
    }
}  
server {
    listen 80;
    server_name www.test2.com;
    location / {
        root  /tmp/test/test2/;
        index   index.html;
    }
}

​ 基于不同端口的虚拟主机配置

#第一个站点的配置,监听80端口
server {
    #定义网站端口的参数
    listen       80;
    # 填写网站域名的参数
    server_name  localhost;
    location / {
        # root关键词定义的是 网页根目录的路径
        root   /etc/test/test3;
        # index参数 定义的是首页文件的名字
        index  index.html;
    }
}

 第二个站点的配置,监听81端口
server {
    listen 81;
    server_name  localhost;
    location / {
        root /etc/test/test4;
        index index.html;
    }
}
4.总结nginx日志格式定制

配置需要日志模块 ngx_http_log_module 的支持。 错误日志一般填写在location模块中,日志格式通过 log_format 命令来定义,ginx 日志相关的配置 包括 access_logrewrite_logerror_log

log_format 指令
Nginx 预定义了名为 main 日志格式,如果没有明确指定日志格式将默认使用该格式:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" "$http_x_forwarded_for"';
                 
                 
如果不想使用Nginx预定义的格式,可以通过log_format指令来自定义:

# 语法:
log_format name [escape=default|json] string ...;
name 格式名称。在 access_log 指令中引用。
escape 设置变量中的字符编码方式是json还是default,默认是default。
string 要定义的日志格式内容。该参数可以有多个。参数中可以使用Nginx变量。


下面是log_format指令中常用的一些变量:
 
$bytes_sent:发送给客户端的总字节数
 
$body_bytes_sent:发送给客户端的字节数,不包括响应头的大小
 
$connection:连接序列号
 
$connection_requests:当前通过连接发出的请求数量
 
$mses:日志写入时间,单位为秒,精度是毫秒
 
$pipe:如果请求是通过http流水线发送,则其值为“p”,否则为“.”
 
$request_length:请求长度
 
$request_time:请求处理时长
 
$status:响应状态码
 
$time_iso8601:标准格式的本地时间
 
$time_local:通用日志格式下的本地时间
 
$http_referer:请求的referer地址
 
$http_user_agent:客户端浏览器信息
 
$remote_addr:客户端IP
 
$http_x_forwarded_for:当前端有代理服务器时,记录web节点记录客户端地址的配置
 
$request:完整的原始请求行
 
$remote_user:客户端用户名称
 
$request_url:完整的请求地址

access_log
作用域
可以应用access_log指令的作用域分别有http,server,location,也就是说,在这几个作用域外使用该指令,Nginx会报错。

access_log /var/logs/nginx-access.log combined;

error_log 
错误日志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息。
语法:
配置错误日志文件的路径和日志级别。

error_log file [level];
Default:
error_log logs/error.log error;
file 参数指定日志的写入位置。
level 参数指定日志的级别。level可以是debug, info, notice, warn, error, crit,alert,emerg中的任意值。可以看到其取值范围是按紧急程度从低到高排列的。只有日>志的错误级别等于或高于level指定的值才会写入错误日志中。

error_log  /var/log/nginx/error.log;

配置段:http, mail, stream, server, location作用域。

例子中指定了错误日志的路径为:/var/log/nginx/error.log,日志级别使用默认的 error。
rewrite_log
由ngx_http_rewrite_module模块提供的。用来记录重写日志的。对于调试重写规则建议开启,启用时将在error log中记录重写日志。

rewrite_log on | off;
 
默认值: 
rewrite_log off;

配置段: http, server, location, if作用域。
5.总结 nginx反向代理及https安全加密

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。

Nginx反向代理模块的指令是由ngx_http_proxy_module模块进行解析

proxy_pass 该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式
proxy_set_header  该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给代理的服务器
proxy_redirect  该指令是用来重置头信息中的"Location"和"Refresh"的值
反向代理单台 Web 服务器
[root@centos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
  listen 80;
  server_name www.test.org;
  location / {
  proxy_pass http://10.0.0.18/; 
  proxy_set_header Host $http_host; #转发主机头至后端服务器
  proxy_connect_timeout 10s;
  }
}
nginx -s reload   #重启Nginx 并访问测试

Http 反向代理负载均衡

Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能

http upstream 配置参数

范例:

## Basic reverse proxy server ##
upstream backend  {
    server 127.0.0.1:8080; # local server
}

server {
    location / {
        proxy_pass  http://backend;
    }
}

实现负载均衡

[root@centos8 ~]#vim /apps/nginx/conf.d/proxy.conf
upstream websrvs {
     server 10.0.0.101:80 ;
     server 10.0.0.102:80 ;
}
server {
     listen 80;
     server_name www.test.org;
     return 302 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
     server_name www.wang.org;
     ssl_certificate /apps/nginx/ssl/www.wang.org.pem;
     ssl_certificate_key /apps/nginx/ssl/www.wang.org.key;
     ssl_session_cache shared:sslcache:20m;
     ssl_session_timeout 10m;
     location / {
         proxy_pass http://websrvs;
         proxy_set_header Host $http_host;
       }
}

[root@ubuntu2204 conf.d]#vim www.test.org.conf
upstream webservers{
    server 10.0.0.201;
    server 10.0.0.202;
}
server {
    listen 80;
    listen 443 ssl;
    server_name www.wang.org;
    root /data/nginx/html/pc;
    ssl_certificate /apps/nginx/conf/conf.d/ssl/www.wang.org.pem ;
    ssl_certificate_key /apps/nginx/conf/conf.d/ssl/www.wang.org.key ;
    access_log logs/www.wang.org-access.log main;
    location / {
     proxy_pass http://webservers;
     proxy_set_header host $http_host;
      #root /data/nginx/html/pc;
     index index.html;
     if ($scheme = http ) {
         #return 302 https://$server_name$request_uri;
         rewrite ^/(.*) https://$server_name/$1 redirect;
        }
      }
}

1.https简介

HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据

2.https协议原理

首先,客户端与服务器建立连接,各自生成私钥和公钥,是不同的。服务器返给客户端一个公钥,然后客户端拿着这个公钥把要搜索的东西加密,称之为密文,并连并自己的公钥一起返回给服务器,服务器拿着自己的私钥解密密文,然后把响应到的数据用客户端的公钥加密,返回给客户端,客户端拿着自己的私钥解密密文,把数据呈现出来

需要http_ssl_module模块支持

证书和私钥的生成
#自签名CA证书
[root@centos8 ~]# cd /apps/nginx/
[root@centos8 nginx]# mkdir certs
[root@centos8 nginx]# cd certs/
[root@centos8 nginx]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout
ca.key -x509 -days 3650 -out ca.crt #自签名CA证书
Generating a 4096 bit RSA private key
.................++
.....
Country Name (2 letter code) [XX]:CN #国家代码
State or Province Name (full name) []:BeiJing #省份
Locality Name (eg, city) [Default City]:Beijing #城市名称
Organization Name (eg, company) [Default Company Ltd]:wang.Ltd #公司名称
Organizational Unit Name (eg, section) []:wang #部门
Common Name (eg, your name or your server's hostname) []:ca.wang.org #通用名称
Email Address []: #邮箱
[root@centos8 certs]# ll ca.crt
-rw-r--r-- 1 root root 2118 Feb 22 12:10 ca.crt
#自制key和csr文件
[root@centos8 certs]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout
www.wang.org.key -out www.wang.org.csr
Generating a 4096 bit RSA private key
........................................................................++
......
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BeiJing
Locality Name (eg, city) [Default City]:BeiJing
Organization Name (eg, company) [Default Company Ltd]:wang.org
Organizational Unit Name (eg, section) []:wang.org
Common Name (eg, your name or your server's hostname) []:www.wang.org
Email Address []:2973707860@qq.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@centos8 certs]# ll
total 16
-rw-r--r-- 1 root root 2118 Feb 22 12:10 ca.crt
-rw-r--r-- 1 root root 3272 Feb 22 12:10 ca.key
-rw-r--r-- 1 root root 1760 Feb 22 12:18 www.wang.org.csr
-rw-r--r-- 1 root root 3272 Feb 22 12:18 www.wang.org.key
#签发证书
[root@centos8 certs]# openssl x509 -req -days 3650 -in www.wang.org.csr -CA
ca.crt -CAkey ca.key -CAcreateserial -out www.wang.org.crt
#验证证书内容
[root@centos8 certs]# openssl x509 -in www.wang.org.crt -noout -text
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
bb:76:ea:fe:f4:04:ac:06
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=BeiJing, L=Beijing, O=wang.Ltd, OU=wang,
CN=wang.ca/emailAddress=2973707860@qq.com
Validity
Not Before: Feb 22 06:14:03 2019 GMT
Not After : Feb 22 06:14:03 2020 GMT
Subject: C=CN, ST=BeiJing, L=BeiJing, O=wang.org, OU=wang.org,
CN=www.wang.org/emailAddress=2973707860@qq.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
#合并CA和服务器证书成一个文件,注意服务器证书必须在前,ca证书在后,否则会出错
[root@centos8 certs]#cat www.wang.org.crt ca.crt > www.wang.org.pem
配置文件
server {
    listen 80;
    listen 443 ssl http2;
    server_name www.test.org;
    ssl_certificate /apps/nginx/certs/www.test.org.pem;
    ssl_certificate_key /apps/nginx/certs/www.test.org.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    root /data/nginx/html;
}
#重启Nginx并访问验证
posted @ 2024-04-14 19:18  美食家哇哈哈  阅读(17)  评论(0)    收藏  举报