- 完成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
- 完成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
- 總結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;
}
}
- 總結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;
- 總結 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證書在後,否則會出錯
- 實驗完成基於LNMP和Redis的phpmyadmin的會話保持,記錄完整步驟
系統: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