1.架構圖

2.nginx
2.1 nginx支持htpps
- openssl生成證書私鑰(這里需要輸入兩次密碼,請謹記)

openssl genrsa -des3 -out 《證書名稱》.key 2048
- openssl生成不需要密碼的密鑰

openssl rsa -in test.key -out 《要生成的無密碼私鑰名稱》.key
- openssl創建證書簽名檔案(根據要求填寫資訊)

openssl req -new -key 《私鑰名稱》.key -out 《要生成的簽名檔案名稱》.csr
- 生成證書

openssl x509 -req -days 365 -in 《簽名檔案名稱》.csr -signkey 《私鑰名稱》.key -out 《要生成的證書名稱》.crt
2.2 nginx https分流配置
server {
#埠后邊+ ssl 意思是開啟ssl支持https
listen 10086 ssl;
server_name <專案名稱要和生成私鑰的compony對應上才可>;
#SSL配置
ssl_certificate /ssl/test.crt; # 配置證書地址
ssl_certificate_key /ssl/test_nopass.key; # 配置證書私鑰地址
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 配置SSL協議版本
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 配置SSL加密演算法
ssl_prefer_server_ciphers on; # 優先采取服務器演算法
ssl_session_cache shared:SSL:10m; # 配置共享會話快取大小
ssl_session_timeout 10m; # 配置會話超時時間
charset utf-8;
location / {
proxy_pass https://webgroup;
# 如下的配置很重要不然會發現有些前后端未分離的專案頁面請求路徑前綴會變成proxy_pass
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
2.3 完整的nginx conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
upstream webgroup{
ip_hash;
server 10.36.6.20:81 weight=1;
server 10.36.6.20:82 weight=1;
}
#埠后邊+ ssl 意思是開啟ssl支持https
listen 10086 ssl;
server_name <專案名稱要和生成私鑰的compony對應上才可>;
#SSL配置
ssl_certificate /ssl/test.crt; # 配置證書地址
ssl_certificate_key /ssl/test_nopass.key; # 配置證書私鑰地址
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 配置SSL協議版本
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 配置SSL加密演算法
ssl_prefer_server_ciphers on; # 優先采取服務器演算法
ssl_session_cache shared:SSL:10m; # 配置共享會話快取大小
ssl_session_timeout 10m; # 配置會話超時時間
charset utf-8;
location / {
proxy_pass https://webgroup;
# 如下的配置很重要不然會發現有些前后端未分離的專案頁面請求路徑前綴會變成proxy_pass
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2.4 nginx docker-componse
# nginx ---------------------------------------------
nginx:
labels:
service: nginx
logging:
options:
labels: "service"
restart: always
image: nginx
container_name: nginx
ports:
- 8080:80
- 80:1080
volumes:
- /nginx/nginx.conf:/etc/nginx/nginx.conf
- /nginx/log:/var/log/nginx
- /ssl:/ssl
networks:
- soil-net
environment:
- TZ=Asia/Shanghai
3.web服務自動切換資料源配置
前言: 這里使用的阿里的資料庫連接池druid,靈感來自于他的主從分離,我一想你可以主從分離那肯定是哪里可以該資料庫的url地址啊,然后我一行一行debug終于找到了一個辦法可以改,但是這樣只是個臨時湊合的辦法會慢,我的服務切換會有五六秒的時間才可以切換過來,再此建議增加中間件keepalive+雙主備份的情況讓服務和mysql解耦
3.1攔截例外
@ControllerAdvice(value = "要攔截的目錄例如com.test.controller")
@Slf4j
public class DefaultGlobalExceptionHandlerAdvice {
/**
* 資料庫連接超時
*
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler(RecoverableDataAccessException.class)
public ReturnMsg dataAccessResourceFailureException(RecoverableDataAccessException ex) {
//發生例外切換資料源
CustomizeDruidDataSource.switchDbType();
return "系統例外!";
}
}
3.2切換url的工具類
前言: 我還做了讀寫分離的一些作業,但沒必要展示,這里的urls可以自己往里邊傳,我是有個組態檔自己拼裝了一個陣列放進來的
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @explain 替換掉alibaba資料源類,動態切換資料庫,一旦資料庫掛掉切換到另一臺
* @Classname CustomizeDruidDataSource
* @Date 2021/10/11 12:20
* @Created by hanzhao
*/
public class CustomizeDruidDataSource extends DruidDataSource {
private boolean lastInited;
private static boolean dbStatus = true; //true代表主庫運行正常,false代表主庫運行例外
private String[] urls;
public static void switchDbType() {
if(dbStatus){
dbStatus = false;
}else{
dbStatus = true;
}
}
public String[] getUrls() {
return urls;
}
public void setUrls(String[] urls) {
this.urls = urls;
}
@Override
public void init() throws SQLException {
lastInited = inited;
super.init();
if (!lastInited && inited) {
new Thread(new ValidateUrlTask()).start();
}
}
class ValidateUrlTask implements Runnable {
@Override
public void run() {
while (true) {
// 如果這個資料源被關閉了,就結束這個定時任務
if (isClosed()) {
break;
}
//如果這個資料源已經被初始化了,同時連接例外才進行處理
if (isInited() && !dbStatus) {
for (String thisUrl : urls) {
Connection connection = null;
try {
connection = DriverManager.getConnection(thisUrl, username, password);
jdbcUrl = thisUrl;
CustomizeDruidDataSource.switchDbType();
} catch (Exception ignored) {
} finally {
try {
connection.close();
} catch (Exception ignored) {
}
}
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
}
}
}
}
3.3springboot配置
spring:
#資料源地址
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主庫資料源
master:
url: jdbc:mysql://url?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: 密碼
# 從庫資料源
slave:
#從資料源開關/默認關閉
enabled: true
url: jdbc:mysql://url?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: 密碼
# 初始連接數
initialSize: 5
# 最小連接池數量
minIdle: 10
# 最大連接池數量
maxActive: 20
# 配置獲取連接等待超時的時間
maxWait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一個連接在池中最大生存的時間,單位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置檢測連接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 設定白名單,不填則允許所有訪問
allow:
url-pattern: /monitor/druid/*
filter:
stat:
enabled: true
# 慢SQL記錄
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
4.mysql主從備份
4.1 mysql組態檔
[mysqld]
# [必須]服務器唯一ID,默認是1,一般取IP最后一段
server-id=1
# [必須]啟用二進制日志
log-bin=mysql-bin
# 復制過濾:也就是指定哪個資料庫不用同步(mysql庫一般不同步)
binlog-ignore-db=mysql
# 資料目錄
datadir = /var/lib/mysql
# 錯誤日志位置
log-error = /var/log/mysql/error.log
# 設定需要同步的資料庫 binlog_do_db = 資料庫名;
# 如果是多個同步庫,就以此格式另寫幾行即可,
# 如果不指明對某個具體庫同步,表示同步所有庫,除了binlog-ignore-db設定的忽略的庫
# binlog_do_db = test #需要同步test資料庫,
# 確保binlog日志寫入后與硬碟同步
sync_binlog = 1
# 跳過所有的錯誤,繼續執行復制操作
slave-skip-errors = all
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
4.2 docker-componse檔案
soilmysql_master:
labels:
service: soilmysql_master
logging:
options:
labels: "service"
user: "root"
restart: always
image: mysql:5.7
container_name: "mysql_master"
ports:
- "10086:3306"
volumes:
- 《將資料庫日志資料等資訊存盤到宿主的磁盤中》:/var/lib/mysql
- 《宿主mysql組態檔路徑》:/etc/mysql/mysql.conf.d/mysqld.cnf
environment:
MYSQL_ROOT_PASSWORD: 初始root賬戶密碼
networks:
- soil-net
soilmysql_slave:
labels:
service: mysql_slave
logging:
options:
labels: "service"
user: "root"
restart: always
image: mysql:5.7
container_name: "soilmysql_slave"
ports:
- "10010:3306"
volumes:
- 《將資料庫日志資料等資訊存盤到宿主的磁盤中》:/var/lib/mysql
- 《宿主mysql組態檔路徑》:/etc/mysql/mysql.conf.d/mysqld.cnf
environment:
MYSQL_ROOT_PASSWORD: 初始root賬戶密碼
networks:
- soil-net
4.3 mysql雙主命令
- 將my.cnf組態檔拷貝到docker-componse掛載的目錄下
- 記得修改server-id
- 分別進入容器中執行以下命令
mysql -uroot -p<密碼>
CREATE USER ‘《同步賬戶》’@’%’ IDENTIFIED BY ‘《同步賬戶的密碼》’;
GRANT ALTER, SHOW VIEW, SHOW DATABASES, SELECT, PROCESS, EXECUTE, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TABLESPACE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, INDEX, INSERT, REFERENCES, TRIGGER, UPDATE, CREATE USER, FILE, LOCK TABLES, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHUTDOWN, SUPER ON . TO ‘《同步賬戶》’@’%’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
CHANGE MASTER TO master_host=’<另一臺機器的ip地址>’, master_port=<另一臺機器的埠號>, master_user=’《同步賬戶》’, master_password=’《同步賬戶的密碼》’;
START SLAVE; - 上述步驟在兩臺機器上全部執行完成后,查看狀態
SHOW SLAVE STATUS;
Slave_IO_Running | Slave_SQL_Running都為yes 才算成功
5.參考文獻
5.1 nginx+ssl
http://nginx.org/en/
https://www.nginx.cn/doc/
https://www.jianshu.com/p/06952c316f0c
https://www.runoob.com/w3cnote/nginx-setup-intro.html
https://blog.csdn.net/u011659193/article/details/85778764
https://blog.csdn.net/zhenghongcs/article/details/109302331
5.2 mysql雙主備份
https://www.cnblogs.com/a1304908180/p/10351930.html
https://blog.csdn.net/zhangguanghui002/article/details/78959816
https://www.jianshu.com/p/70ca1ef79cd4
https://help.aliyun.com/knowledge_detail/41106.html?spm=a2c6h.13066369.0.0.5ae84055BKlrw9#XACzT
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/316502.html
標籤:其他
上一篇:ESP8266 Web Server (WebSocket) 實作多控制元件多引腳調節(PWM)
下一篇:什么是mqtt
