Featured image of post Nginx模板自动化

Nginx模板自动化

背景在日常工作中,我们经常需要创建配置文件的模板,以便在不同的环境中快速部署和配置服务器。然而,这样的任务通常需要重复性高、耗时长,且容易出错。为了加快这些任务的完成,并提高工作效率,可以使用一些自动。。。。。。。

背景

在日常工作中,我们经常需要创建Nginx配置文件的模板,以便在不同的环境中快速部署和配置Nginx服务器。然而,这样的任务通常需要重复性高、耗时长,且容易出错。为了加快这些任务的完成,并提高工作效率,可以使用一些自动化工具来简化Nginx配置文件的生成和管理。

其中,一种常见的方法是使用基于文本替换的模板引擎,如Jinja2、Mustache等,将Nginx配置文件中的变量替换为实际的值。例如,可以将配置文件中的端口号、域名、SSL证书路径等信息作为变量,在部署时再根据实际情况进行替换,从而快速生成满足需求的Nginx配置文件。此外,还可以使用版本控制工具(如Git)来对Nginx配置文件进行管理,并利用CI/CD工具(如Jenkins)自动构建和部署Nginx服务器。

通过自动化工具的使用,可以大大提高Nginx服务器的配置效率和准确性,并更好地适应不同环境下的需求。

1、需求

开发部门 不定期会更新新的项目上线,会用到域名绑定服务器 进行暴露。

流程

  1. 开发部门提出域名订单需求,包括需要绑定的域名和相应的服务器地址。
  2. 运维部门在DNS管理控制面板中添加DNS解析记录,将需要绑定的域名解析到相应的服务器IP地址。
  3. 运维部门在Nginx配置中创建新的server块,配置要绑定的域名和相应的站点信息,例如文档根目录、日志文件、SSL证书等。
  4. 运维部门将Nginx配置文件中的变量和实际的服务器地址进行替换,例如替换$server_name变量为实际要绑定的域名。
  5. 运维部门重载或重新启动Nginx服务,使新的配置生效。
  6. 最终,域名解析到相应的服务器地址,并由Nginx正确地将请求路由到相应的站点。 在这里插入图片描述

2、kubernetes+ingress实战

1、转发kubernetes的ingress

kubernetes-cluster.conf

1
2
3
4
upstream kubernetes-cluster {
  server 192.168.82.42 weight=5;
  keepalive 16;
}

2、域名配置

ogateway-uat.xxxx.net.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
        listen       80;
        server_name   ogateway-uat.xxxx.net;
        rewrite ^/(.*)$ https://$host/$1 permanent;
        # IP白名单
        include /usr/local/openresty/nginx/whitelist/corporation.conf;
    
}
server {
        listen       443 ssl;
        server_name   ogateway-uat.xxxx.net;


        ssl                   on;
        ssl_certificate      /usr/local/openresty/nginx/ssl/xxx.net.crt;
        ssl_certificate_key  /usr/local/openresty/nginx/ssl/xxx.net.key;
        include ssl.conf;
        # IP白名单 放开时间0920-0930
        include /usr/local/openresty/nginx/whitelist/corporation.conf;
        location / {
            proxy_pass  http://kubernetes-cluster;
        include https_proxy.conf;
        }
}

3、反向代理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
        listen       80;
        server_name  customer-uat.xxxxx.com;
        # IP白名单
        include /usr/local/openresty/nginx/whitelist/corporation.conf;
        
        rewrite ^/(.*)$ https://$host/$1 permanent;
}
server {
        listen       443 ssl;
        server_name  customer-uat.xxxx.com;
        # IP白名单
        include /usr/local/openresty/nginx/whitelist/corporation.conf;

        ssl                   on;
        ssl_certificate      /usr/local/openresty/nginx/ssl/xxxx.com.crt;
        ssl_certificate_key  /usr/local/openresty/nginx/ssl/xxxxx.com.key;
        include ssl.conf;

        location / {
            proxy_pass  http://192.168.102.202;
            include proxy.conf;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header X-Forwarded-HTTPS on;
            add_header Front-End-Https on;
        }
}

4、负载轮询代理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
upstream xxxx-backend-uat {
     #server 192.168.99.147:1201;
     server 192.168.82.42;
}
server {
    listen 80;
    server_name inhouse-xxxx-uat.xxxx.com;
    include /usr/local/openresty/nginx/whitelist/corporation.conf;

	location / {
        proxy_pass  http://xxxx-backend-uat;
        include http_proxy.conf;
    }
}
server {
    listen 443 ssl;
    server_name xxxx-backend-uat.xxxx.com;
    include /usr/local/openresty/nginx/whitelist/corporation.conf;

    ssl                   on;
    ssl_certificate      /usr/local/openresty/nginx/ssl/xxxx.com.crt;
    ssl_certificate_key  /usr/local/openresty/nginx/ssl/xxxx.com.key;
    include ssl.conf;

    location / {
        proxy_pass  http://xxxx-backend-uat;
        include http_proxy.conf;
    }
}

5、自动化处理

add_nginx.sh

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#!/bin/bash

#日志级别 debug-1, info-2, warn-3, error-4, always-5
LOG_LEVEL=1

#日志名称
job_name=add_nginx

#脚本目录
script_dir=/opt

#日志文件
LOG_FILE=./${job_name}.log

#调试日志
function log_debug() {
	content="[DEBUG] $(date '+%Y-%m-%d %H:%M:%S') $@"
	[ $LOG_LEVEL -le 1 ] && echo $content >>$LOG_FILE && echo -e "\033[32m" ${content} "\033[0m"
}
#信息日志
function log_info() {
	content="[INFO] $(date '+%Y-%m-%d %H:%M:%S') $@"
	[ $LOG_LEVEL -le 2 ] && echo $content >>$LOG_FILE && echo -e "\033[32m" ${content} "\033[0m"
}
#警告日志
function log_warn() {
	content="[WARN] $(date '+%Y-%m-%d %H:%M:%S') $@"
	[ $LOG_LEVEL -le 3 ] && echo $content >>$LOG_FILE && echo -e "\033[33m" ${content} "\033[0m"
}
#错误日志
function log_err() {
	content="[ERROR] $(date '+%Y-%m-%d %H:%M:%S') $@"
	[ $LOG_LEVEL -le 4 ] && echo $content >>$LOG_FILE && echo -e "\033[31m" ${content} "\033[0m"
}
#一直都会打印的日志
function log_always() {
	content="[ALWAYS] $(date '+%Y-%m-%d %H:%M:%S') $@"
	[ $LOG_LEVEL -le 5 ] && echo $content >>$LOG_FILE && echo -e "\033[32m" ${content} "\033[0m"
}

function get_Whitelist() {
	# 提示用户输入选项
	echo "1. 使用白名单"
	echo "2. 不使用白名单"

	# 获取用户输入
	read -p "请选择要使用白名单配置:" choice_whitelist

	# 使用case语句根据用户选择设置变量
	case $choice_whitelist in
	1)
		use_whitelist=true
		;;
	2)
		use_whitelist=false
		;;
	*)
		echo "错误:请输入正确的选项" >&2
		exit 1
		;;
	esac

}

function set_whitelist() {
  if [ "$use_whitelist" = true ]; then
    log_info "已经设置IP白名单"
    sed -i -r 's/^(\s*)#(.*include\s*\/usr\/local\/openresty\/nginx\/whitelist\/corporation\.conf;.*)$/\1\2/g' "$conf_file"
  else
    log_info "不使用IP白名单"
  fi
}

function check_nginx() {
	conf_file="/chen/company_shell/$realm_name.conf"
	# 检查Nginx配置文件
	if nginx -t >/dev/null 2>&1; then
		echo "Nginx configuration test passed."
	else
		echo "Nginx configuration test failed. Please check your configuration file."
		exit 1
	fi
}

function kubernetes_nginx() {
	re_301='rewrite ^/(.*)$ https://$host/$1 permanent;'
	tld=$(echo "$realm_name" | sed -E 's/.*\.([^.]+\.[^.]+)$/\1/')
	cat >$realm_name.conf <<EOF
server {
        listen       80;
        server_name  $realm_name;
	# IP白名单
        #include /usr/local/openresty/nginx/whitelist/corporation.conf;
        $re_301
}
server {
        listen       443 ssl;
        server_name  $realm_name;
        ssl                   on;
        ssl_certificate      /usr/local/openresty/nginx/ssl/$tld.crt;
        ssl_certificate_key  /usr/local/openresty/nginx/ssl/$tld.key;
        include ssl.conf;
	# IP白名单
        #include /usr/local/openresty/nginx/whitelist/corporation.conf;

        location / {
           proxy_pass  http://kubernetes-cluster;
           include https_proxy.conf;
        }
}
EOF
}

function proxy_nginx() {
	read -p "设置反向代理(列如:http://172.18.199.115):" proxy_ip
	re_301='rewrite ^/(.*)$ https://$host/$1 permanent;'
	tld=$(echo "$realm_name" | sed -E 's/.*\.([^.]+\.[^.]+)$/\1/')
	cat >$realm_name.conf <<EOF
server {
        listen       80;
        server_name  $realm_name;
	    $re_301
	
	# IP白名单
        #include /usr/local/openresty/nginx/whitelist/corporation.conf;
}
server {
        listen       443 ssl;
        server_name  $realm_name;

	# IP白名单
        #include /usr/local/openresty/nginx/whitelist/corporation.conf;

        ssl                   on;
        ssl_certificate      /usr/local/openresty/nginx/ssl/$tld.crt;
        ssl_certificate_key  /usr/local/openresty/nginx/ssl/$tld.key;
        include ssl.conf;

        location / {
        	proxy_pass  $proxy_ip;
		include https_proxy.conf;
        }
}
EOF
}

function upstream_nginx() {
	pass
}

# 定义函数:生产域名
function set_kubernetes_nginx() {
	# TODO: 在这里实现生产域名的操作
	log_info "开始配置nginx模板"
	read -p "请输您的域名:  " realm_name
	log_info "域名记录: $realm_name"
	get_Whitelist
	kubernetes_nginx
	# 输出变量值
	set_whitelist
	#配置文件校检
	check_nginx
}

function set_reverse_proxy_nginx() {
	# TODO: 在这里实现生产域名的操作
	log_info "开始配置nginx模板"
	read -p "请输您的域名:  " realm_name
	log_info "域名记录: $realm_name"
	get_Whitelist
	proxy_nginx
	# 输出变量值
	set_whitelist
	#配置文件校检
	check_nginx
}

function set_upstream_proxy_nginx() {
	# TODO: 在这里实现生产域名的操作
	log_info "开始配置nginx模板"
	read -p "请输您的域名:  " realm_name
	log_info "域名记录: $realm_name"
	get_Whitelist
	upstream_nginx
	# 输出变量值
	set_whitelist
	#配置文件校检
	check_nginx
}

# 定义主函数
function main() {
	# 显示菜单
	echo "请选择一个选项:"
	echo "1. kubernetes接入"
	echo "2. 反向代理接入"
	echo "3. 负载均衡接入"

	# 读取用户输入
	read -p "请输您的选择:  " choice

	# 根据用户输入选择对应的操作
	case $choice in
	1) set_kubernetes_nginx ;;
	2) set_reverse_proxy_nginx ;;
	3) set_upstream_proxy_nginx ;;
	*) echo "无效的选项,请重新输入" ;;
	esac

}

# 调用主函数
main

在这里插入图片描述