第十週
-
完成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
-
完成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
-
總結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_log
、rewrite_log
、error_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並訪問驗證