第十週

美食家哇哈哈發表於2024-04-14

第十週

  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並訪問驗證

相關文章