Files
dock/端口转发
2025-10-29 11:38:20 +08:00

306 lines
9.3 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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