第十週-雲端計算運維作業

TestAL4193發表於2024-07-16
  1. 完成nginx編譯安裝指令碼

#!/bin/bash
NGINX_VERSION=1.20.2
INSTALL_DIR=/usr/local/src
NEW_PATH="/usr/local/src/nginx/sbin"
sudo su -c "getent passwd nginx" -s /bin/bash root && useradd -s /sbin/nologin nginx
wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz || { echo "下載失敗!";exit 20;  }
tar xf nginx-${NGINX_VERSION}.tar.gz -C /usr/local/src
yum -y install gcc openssl-devel pcre-devel
cd /usr/local/src/nginx-${NGINX_VERSION}
./configure --prefix=${INSTALL_DIR} --with-http_ssl_module
make -j `grep -c processor /proc/cpuinfo`&& make install
if [ $? -ne 0 ];then
	echo Install nginx is failed!
	exit 10 
else
	echo "Install nginx is finished!" 
	sed -i "s|^\(PATH=.*\)|\1:$NEW_PATH|" ~/.bash_profil
fi

echo "<h1> hello world </h1>" > ${INSTALL_DIR}/html/index.html

  1. 完成nginx平滑升級,總結步驟

wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar xvf nginx-1.20.1.tar.gz
cd nginx-1.20.1 

/apps/nginx/sbin/nginx -v #檢視編譯引數
[root@centos8 nginx-1.20.1]#make
[root@centos8 nginx-1.20.1]#objs/nginx -v
ll objs/nginx /apps/nginx/sbin/nginx #檢視版本

cp /apps/nginx/sbin/nginx /opt/nginx.old  #備份
cp -f ./objs/nginx /apps/nginx/sbin/ #新版覆蓋舊版


#傳送訊號USR2 平滑升級可執行程式,將儲存有舊版本主程序PID的檔案重新命名為nginx.pid.oldbin,並啟動新的nginx
#此時兩個master的程序都在執行,只是舊的master不在監聽,由新的master監聽80
#此時Nginx開啟一個新的master程序,且這個新master程序會生成新的worker程序,即升級後的Nginx程序,此時老的程序不會自動退出,新的請求仍由舊程序處理。

kill -USR2 `cat /apps/nginx/logs/nginx.pid
注意:這裡需要確保nginx的啟動方式是以絕對路徑方式啟動,否則會出現execve() failed while executing new binary process "nginx" (2: No such file or directory)的報錯。
#如果有新請求,仍由舊版本提供服務
[root@ubuntu2204 ~]#curl -I 127.0.0.1

#先關閉舊nginx的worker程序,而不關閉舊nginx主程序方便回滾
#向原老的Nginx主程序傳送WINCH訊號,它會平滑關閉老的工作程序(主程序不退出),這時所有新請求都會由新版Nginx處理

kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`

#經過一段時間測試,新版本服務沒問題,最後傳送QUIT訊號,退出老的master,完成全部升級過程
[root@centos8 nginx-1.20.1]#kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`

在高版本,可以直接在將新檔案copy過去後,使用:
make upgrade
  1. 總結nginx核心配置,並實現nginx多虛擬主機

user nginx; #user: 指定 Nginx 執行的使用者和組
worker_processes auto;#定義工作程序的數量。通常設定為 CPU 核心數
error_log /var/log/nginx/error.log warn;#指定錯誤日誌檔案的位置和日誌級別
pid /var/run/nginx.pid; #指定儲存 Nginx 程序 ID 的檔案位置

events {
	worker_connections 1024;#每個工作程序的最大連線數
	use epoll;#指定事件驅動模型,如 epoll(Linux)或 kqueue(FreeBSD)
}

http {
	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	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 /var/log/nginx/access.log main;#指定訪問日誌檔案的位置和使用的日誌格式

	sendfile on;#啟用高效檔案傳輸
	keepalive_timeout 65;#客戶端連線保持活動的超時時間
	gzip on;#啟用響應資料的 gzip 壓縮

	server {
		listen 80;#監聽埠
		server_name example.com;#伺服器域名
		root /var/www/html;#根目錄
		index index.html index.htm;#預設索引

		location / {
			try_files $uri $uri/ =404;
		}

		location /re/ {
			rewrite /1.html /2.html permanent; #重定向
		}#redirect 臨時302 #permanent 永久301

		location /api/ {
			proxy_pass http://10.0.0.18:8080;#代理到其他伺服器
		}
	}
}

nginx多虛擬主機

user nginx;

http {
	include /etc/nginx/mime.types;

	# 虛擬主機1: test1.com
	server {
		listen 80;
		server_name test1.com www.test1.com;
		root /var/www/example.com;
		index index.html index.htm;

}

	# 虛擬主機2: test.com
	server {
		listen 80;
		server_name test.com www.test.com;

		root /var/www/test.com;
		index index.html index.htm;

	}
}
  1. 總結nginx日誌格式定製

變數
$remote_addr # 記錄客戶端IP地址
$remote_user # 記錄客戶端使用者名稱
$time_local # 記錄通用的本地時間
$time_iso8601 # 記錄ISO8601標準格式下的本地時間
$request # 記錄請求的方法以及請求的http協議
$status # 記錄請求狀態碼(用於定位錯誤資訊)
$body_bytes_sent # 傳送給客戶端的資源位元組數,不包括響應頭的大小
$$bytes_sent # 傳送給客戶端的總位元組數($msec:) # 日誌寫入時間。單位為秒,精度是毫秒。
$http_referer # 記錄從哪個頁面連結訪問過來的
$http_user_agent # 記錄客戶端瀏覽器相關資訊
$http_x_forwarded_for #記錄客戶端IP地址
$request_length # 請求的長度(包括請求行,請求頭和請求正文)。
$request_time # 請求花費的時間,單位為秒,精度毫秒

自定義預設格式日誌

 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'-$http_x_forwarded_fo;

access_log logs/access.log   access_log_format;

自定義 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;
  1. 總結 nginx反向代理及https安全加密

反向代理、反向代理快取

server {
	listen 80;
	listen 443 ssl http2;
	server_name test.com;
	ssl_certificate /etc/nginx/certs/www.test.org.pem;
 	ssl_certificate_key /etc/nginx/certs/www.test.org.key;
	ssl_session_cache shared:sslcache:20m;
	ssl_session_timeout 10m;
location / {
    proxy_pass http://192。168.1.133; #代理
    proxy_set_header Host $host; #設定轉發請求頭,以便目標伺服器能夠獲取客戶端的真實資訊
    proxy_set_header X-Real-IP $remote_addr;
    proxy_cache proxycache; #快取
    proxy_cache_key $request_uri; #對指定的資料進行MD5的運算做為快取的key
    proxy_cache_valid 200 302 10m; #指定響應碼的快取時間
    proxy_cache_valid any 1m;   #除指定的狀態碼返回的資料以外的快取多長時間,必須設定,否則不會快取

	}
}

https加密

cd /etc/nginx/
mkdir certs
cd certs/
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt #生成CA私鑰和自簽名證書
openssl req -newkey rsa:4096 -nodes -sha256 -keyout www.test.org.key     -out www.test.org.csr #生成私鑰和自簽名證書
openssl x509 -req -days 3650 -in www.test.org.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.test.org.crt #簽發證書
cat www.wang.org.crt ca.crt > www.wang.org.pem #合併CA和伺服器證書成一個檔案,注意伺服器證書必須在前,ca證書在後,否則會出錯
  1. 實驗完成基於LNMP和Redis的phpmyadmin的會話保持,記錄完整步驟

image

系統:ubuntu 192.168.1.139 mysql|redis

**mysql**

	apt update && apt -y install mysql-server

	vim /etc/mysql/mysql.conf.d/mysqld.cnf
	#bind-address           = 127.0.0.1 #修改
	#mysqlx-bind-address   = 127.0.0.1

	systemctl restart mysql.service
	#MySQL8.0要求指定認證外掛
	mysql> create user admin@'192.168.1.%' identified with mysql_native_password by 
	'123456';
	grant all on *.* to admin@'192.168.1.%'; #授權

**redis**

	apt -y install redis

	vim /etc/redis/redis.conf
	 - listen 0.0.0.0 #修改

	systemctl restart redis

系統:ubuntu 192.168.1.148|192.168.1.147 nignx+php

**安裝和配置 PHP-FPM服務使用Redis儲存會話資訊**

	apt-get update && -y install php-fpm php-mysql php-redis php-json php-mbstring #安裝php擴充套件包
	groupadd -g 666 -r www
	useradd -u 666 -g www -s /sbin/nologin -r www #建立使用者和組
	mkdir /etc/nginx/conf.d/
	mkdir /data/www/
	chown -R www.www /etc/nginx

	vim /etc/php/8.1/fpm/pool.d/www.conf #配置php-fpm 
	listen = 127.0.0.1:9000 #必要
	;listen = /run/php/php8.1-fpm.sock
	pm.status_path = /pm_status#不必要
	ping.path = /ping #不必要
	php_value[session.save_handler] = redis
	php_value[session.save_path]    = "tcp://192.168.1.139:6379"
	systemctl restart php8.1-fpm.service

** 配置nginx支援php**

	vim /apps/nginx/conf/nginx.conf #ubnutu建議直接寫入nginx.conf
	user www;
	server {
	   listen 80;
	   server_name www.wang.org;
	   root /data/www/;
	   index index.php;
	   client_max_body_size 20m;
	   location ~ \.php$|/ping|/php-status {
		   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;
	   }
	}

**部署PhpMyAdmin**

	wget https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.zip
	unzip phpMyAdmin-5.2.0-all-languages.zip -d /opt/
	mv /opt/phpMyAdmin-5.2.0-all-languages/* /data/www/
	cp /data/www/config.sample.inc.php config.inc.php
	vim /data/www/config.inc.php
	$cfg['Servers'][$i]['host'] = '192.168.1.139';
	chown -R www.www /data/www/

192.168.1.133 nginx #配置Nginx反向代理實現負載均衡

vim /etc/nginx/conf.d/test.conf
upstream web {
	server 192.168.1.148:80;
	server 192.168.1.147:80;
}
server{
	listen 80;
	server_name www.test;
	index index.php;
	location / {
	   proxy_pass http://web;
	}
}
systemctl restart nginx

image

相關文章