306 lines
9.3 KiB
Bash
306 lines
9.3 KiB
Bash
#!/bin/bash
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 显示标题
|
||
echo -e "${GREEN}"
|
||
echo "========================================"
|
||
echo " Nginx 端口转发一键配置脚本"
|
||
echo "========================================"
|
||
echo -e "${NC}"
|
||
|
||
# 检查是否以root运行
|
||
if [ "$EUID" -ne 0 ]; then
|
||
echo -e "${RED}请使用 sudo 运行此脚本${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查nginx是否安装
|
||
if ! command -v nginx &> /dev/null; then
|
||
echo -e "${YELLOW}检测到未安装 Nginx,正在自动安装...${NC}"
|
||
if [ -f /etc/redhat-release ]; then
|
||
# CentOS/RHEL
|
||
yum install -y nginx
|
||
elif [ -f /etc/debian_version ]; then
|
||
# Ubuntu/Debian
|
||
apt update && apt install -y nginx
|
||
else
|
||
echo -e "${RED}无法自动安装 Nginx,请手动安装后再运行此脚本${NC}"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# 交互式输入配置信息
|
||
echo -e "${BLUE}请输入配置信息(直接回车使用默认值)${NC}"
|
||
|
||
read -p "输入监听端口 (默认: 80): " LISTEN_PORT
|
||
LISTEN_PORT=${LISTEN_PORT:-80}
|
||
|
||
read -p "输入域名或IP(无域名请直接回车): " SERVER_NAME
|
||
SERVER_NAME=${SERVER_NAME:-_}
|
||
|
||
read -p "输入要转发的目标IP或域名: " TARGET_HOST
|
||
if [ -z "$TARGET_HOST" ]; then
|
||
echo -e "${RED}错误:目标地址不能为空${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
read -p "输入要转发的目标端口: " TARGET_PORT
|
||
if [ -z "$TARGET_PORT" ]; then
|
||
echo -e "${RED}错误:目标端口不能为空${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
read -p "输入配置名称(将用于生成配置文件名): " CONFIG_NAME
|
||
if [ -z "$CONFIG_NAME" ]; then
|
||
CONFIG_NAME="proxy_${LISTEN_PORT}_to_${TARGET_HOST}_${TARGET_PORT}"
|
||
fi
|
||
|
||
# 生成配置文件内容
|
||
CONFIG_CONTENT="server {
|
||
listen ${LISTEN_PORT};
|
||
server_name ${SERVER_NAME};
|
||
|
||
# 访问日志设置
|
||
access_log /var/log/nginx/${CONFIG_NAME}_access.log;
|
||
error_log /var/log/nginx/${CONFIG_NAME}_error.log;
|
||
|
||
location / {
|
||
proxy_pass http://${TARGET_HOST}:${TARGET_PORT};
|
||
proxy_set_header Host \$host;
|
||
proxy_set_header X-Real-IP \$remote_addr;
|
||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto \$scheme;
|
||
proxy_connect_timeout 30s;
|
||
proxy_read_timeout 60s;
|
||
proxy_send_timeout 60s;
|
||
|
||
# 可选:WebSocket 支持
|
||
# proxy_http_version 1.1;
|
||
# proxy_set_header Upgrade \$http_upgrade;
|
||
# proxy_set_header Connection \"upgrade\";
|
||
}
|
||
|
||
# 可选:静态文件缓存
|
||
# location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
|
||
# expires 1y;
|
||
# add_header Cache-Control \"public, immutable\";
|
||
# }
|
||
}"
|
||
|
||
# 确定配置文件路径
|
||
if [ -d "/etc/nginx/conf.d" ]; then
|
||
CONFIG_FILE="/etc/nginx/conf.d/${CONFIG_NAME}.conf"
|
||
elif [ -d "/etc/nginx/sites-available" ]; then
|
||
CONFIG_FILE="/etc/nginx/sites-available/${CONFIG_NAME}.conf"
|
||
else
|
||
CONFIG_FILE="/etc/nginx/sites-enabled/${CONFIG_NAME}.conf"
|
||
fi
|
||
|
||
# 写入配置文件
|
||
echo "$CONFIG_CONTENT" | sudo tee "$CONFIG_FILE" > /dev/null
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}✓ 配置文件已创建: ${CONFIG_FILE}${NC}"
|
||
else
|
||
echo -e "${RED}✗ 配置文件创建失败${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# 测试配置文件语法
|
||
echo -e "${YELLOW}测试配置文件语法...${NC}"
|
||
nginx -t
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}✓ 配置文件语法检查通过${NC}"
|
||
|
||
# 重新加载nginx配置
|
||
echo -e "${YELLOW}重新加载 Nginx 配置...${NC}"
|
||
systemctl reload nginx || nginx -s reload
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}✓ Nginx 配置重载成功${NC}"
|
||
echo ""
|
||
echo -e "${BLUE}🎉 配置完成!${NC}"
|
||
echo -e "${BLUE}================================${NC}"
|
||
echo -e "${GREEN}监听端口: ${LISTEN_PORT}"
|
||
echo -e "目标地址: ${TARGET_HOST}:${TARGET_PORT}"
|
||
echo -e "配置文件: ${CONFIG_FILE}"
|
||
echo -e "${BLUE}================================${NC}"
|
||
|
||
# 显示访问URL
|
||
if [ "$SERVER_NAME" != "_" ]; then
|
||
if [ "$LISTEN_PORT" = "80" ]; then
|
||
echo -e "${GREEN}访问地址: http://${SERVER_NAME}${NC}"
|
||
else
|
||
echo -e "${GREEN}访问地址: http://${SERVER_NAME}:${LISTEN_PORT}${NC}"
|
||
fi
|
||
else
|
||
echo -e "${GREEN}访问地址: http://服务器IP:${LISTEN_PORT}${NC}"
|
||
fi
|
||
else
|
||
echo -e "${RED}✗ Nginx 配置重载失败,请检查日志${NC}"
|
||
fi
|
||
else
|
||
echo -e "${RED}✗ 配置文件语法检查失败,请检查配置${NC}"
|
||
echo -e "${YELLOW}已创建的配置文件: ${CONFIG_FILE}${NC}"
|
||
exit 1
|
||
fi#!/bin/bash
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 显示标题
|
||
echo -e "${GREEN}"
|
||
echo "========================================"
|
||
echo " Nginx 端口转发一键配置脚本"
|
||
echo "========================================"
|
||
echo -e "${NC}"
|
||
|
||
# 检查是否以root运行
|
||
if [ "$EUID" -ne 0 ]; then
|
||
echo -e "${RED}请使用 sudo 运行此脚本${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查nginx是否安装
|
||
if ! command -v nginx &> /dev/null; then
|
||
echo -e "${YELLOW}检测到未安装 Nginx,正在自动安装...${NC}"
|
||
if [ -f /etc/redhat-release ]; then
|
||
# CentOS/RHEL
|
||
yum install -y nginx
|
||
elif [ -f /etc/debian_version ]; then
|
||
# Ubuntu/Debian
|
||
apt update && apt install -y nginx
|
||
else
|
||
echo -e "${RED}无法自动安装 Nginx,请手动安装后再运行此脚本${NC}"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# 交互式输入配置信息
|
||
echo -e "${BLUE}请输入配置信息(直接回车使用默认值)${NC}"
|
||
|
||
read -p "输入监听端口 (默认: 80): " LISTEN_PORT
|
||
LISTEN_PORT=${LISTEN_PORT:-80}
|
||
|
||
read -p "输入域名或IP(无域名请直接回车): " SERVER_NAME
|
||
SERVER_NAME=${SERVER_NAME:-_}
|
||
|
||
read -p "输入要转发的目标IP或域名: " TARGET_HOST
|
||
if [ -z "$TARGET_HOST" ]; then
|
||
echo -e "${RED}错误:目标地址不能为空${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
read -p "输入要转发的目标端口: " TARGET_PORT
|
||
if [ -z "$TARGET_PORT" ]; then
|
||
echo -e "${RED}错误:目标端口不能为空${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
read -p "输入配置名称(将用于生成配置文件名): " CONFIG_NAME
|
||
if [ -z "$CONFIG_NAME" ]; then
|
||
CONFIG_NAME="proxy_${LISTEN_PORT}_to_${TARGET_HOST}_${TARGET_PORT}"
|
||
fi
|
||
|
||
# 生成配置文件内容
|
||
CONFIG_CONTENT="server {
|
||
listen ${LISTEN_PORT};
|
||
server_name ${SERVER_NAME};
|
||
|
||
# 访问日志设置
|
||
access_log /var/log/nginx/${CONFIG_NAME}_access.log;
|
||
error_log /var/log/nginx/${CONFIG_NAME}_error.log;
|
||
|
||
location / {
|
||
proxy_pass http://${TARGET_HOST}:${TARGET_PORT};
|
||
proxy_set_header Host \$host;
|
||
proxy_set_header X-Real-IP \$remote_addr;
|
||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto \$scheme;
|
||
proxy_connect_timeout 30s;
|
||
proxy_read_timeout 60s;
|
||
proxy_send_timeout 60s;
|
||
|
||
# 可选:WebSocket 支持
|
||
# proxy_http_version 1.1;
|
||
# proxy_set_header Upgrade \$http_upgrade;
|
||
# proxy_set_header Connection \"upgrade\";
|
||
}
|
||
|
||
# 可选:静态文件缓存
|
||
# location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
|
||
# expires 1y;
|
||
# add_header Cache-Control \"public, immutable\";
|
||
# }
|
||
}"
|
||
|
||
# 确定配置文件路径
|
||
if [ -d "/etc/nginx/conf.d" ]; then
|
||
CONFIG_FILE="/etc/nginx/conf.d/${CONFIG_NAME}.conf"
|
||
elif [ -d "/etc/nginx/sites-available" ]; then
|
||
CONFIG_FILE="/etc/nginx/sites-available/${CONFIG_NAME}.conf"
|
||
else
|
||
CONFIG_FILE="/etc/nginx/sites-enabled/${CONFIG_NAME}.conf"
|
||
fi
|
||
|
||
# 写入配置文件
|
||
echo "$CONFIG_CONTENT" | sudo tee "$CONFIG_FILE" > /dev/null
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}✓ 配置文件已创建: ${CONFIG_FILE}${NC}"
|
||
else
|
||
echo -e "${RED}✗ 配置文件创建失败${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# 测试配置文件语法
|
||
echo -e "${YELLOW}测试配置文件语法...${NC}"
|
||
nginx -t
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}✓ 配置文件语法检查通过${NC}"
|
||
|
||
# 重新加载nginx配置
|
||
echo -e "${YELLOW}重新加载 Nginx 配置...${NC}"
|
||
systemctl reload nginx || nginx -s reload
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo -e "${GREEN}✓ Nginx 配置重载成功${NC}"
|
||
echo ""
|
||
echo -e "${BLUE}🎉 配置完成!${NC}"
|
||
echo -e "${BLUE}================================${NC}"
|
||
echo -e "${GREEN}监听端口: ${LISTEN_PORT}"
|
||
echo -e "目标地址: ${TARGET_HOST}:${TARGET_PORT}"
|
||
echo -e "配置文件: ${CONFIG_FILE}"
|
||
echo -e "${BLUE}================================${NC}"
|
||
|
||
# 显示访问URL
|
||
if [ "$SERVER_NAME" != "_" ]; then
|
||
if [ "$LISTEN_PORT" = "80" ]; then
|
||
echo -e "${GREEN}访问地址: http://${SERVER_NAME}${NC}"
|
||
else
|
||
echo -e "${GREEN}访问地址: http://${SERVER_NAME}:${LISTEN_PORT}${NC}"
|
||
fi
|
||
else
|
||
echo -e "${GREEN}访问地址: http://服务器IP:${LISTEN_PORT}${NC}"
|
||
fi
|
||
else
|
||
echo -e "${RED}✗ Nginx 配置重载失败,请检查日志${NC}"
|
||
fi
|
||
else
|
||
echo -e "${RED}✗ 配置文件语法检查失败,请检查配置${NC}"
|
||
echo -e "${YELLOW}已创建的配置文件: ${CONFIG_FILE}${NC}"
|
||
exit 1
|
||
fi
|