如何在宝塔面板上配置多个站点不卡

我建站一直使用使用vps,一是因为性价比高,二是因为可以布置多站点,三是可以用代码批量做很多事情。

比如一键压缩10万张wordpress图片,一键导入10万个产品。

不过在选择服务器配置上一直有点没思路,都是跟着感觉走,导致有一个vps经常卡死,而站点只有8个。后来我才发现问题,今天总结一下为什么选择vps装了8个站点导致vps还很卡。

选择的vps是linode.com上的,2核4G 24美金/月,但是今天仔细分析才知道,4G,8个站点有点不够用,因为每个站点平均的话只能分到0.5G,而一个高性能的wp站点可能要2G,所以8个站点可能要配置4核16G甚至更多。

不过节省一点也有节省的方法,就是利用php pool,给每个站点做单独的分化。

比如A站点流量大,那么分多一点2G,其他站点流量少,分剩下的2G。

如何给每个站点分配pool

我安装的是宝塔面板,安装的配置都是lnmp,也就是nginx+mysql+php。

nginx上所有站点都默认用一个php pool,这会导致大家挤在一起,可以想象8个胖子挤在一房间里,如果如果一个胖子在房间里跑步,势必会导致其他7个人动弹不了,所以我们要做的事情就是给这8个胖子做几个房间。

我们不用给每个人都做房子,只用给最胖的那个人先,后面的还是先挤一起,如果后面7个人再胖了一个,考虑再分一个房间出来,或者买个大房子。

为了新建一个房间,我们需要做三件事:

  • 新建一个nginx配置文件conf
  • 修改站点配置文件
  • 修改php配置文件

新建nginx配置文件+修改站点配置文件

我们打开站点设置,出现的弹窗中点击「配置文件」,找到

include enable-php-83.conf

这个文件位置在/www/server/nginx/conf

我们复制enable-php-83.conf并改名为enable-php-xxx.conf,其中xxx建议命名为你的站点名称,例如我可以给自己的站点弄一个enable-php-keentalking.conf

编辑enable-php-xxx.con代码如下:

    location ~ [^/]\.php(/|$)
    {
        try_files $uri =404;
        fastcgi_pass  unix:/tmp/php-cgi-xxx.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
        include pathinfo.conf;
    }

同样记得把xxx改成你的站点名称。

然后回到「配置文件」,把include 后面的改成enable-php-xxx.conf

修改php配置文件

打开软件商店-已安装-php8.3,这里的php8.3是我使用的版本,要确认你自己使用了哪个版本的php哦,也很简单,去站点设置里面看下php版本就行,如果你只安装了一个php版本就不用纠结了。

找到「fpm配置文件」,添加一段代码:

[xxx]
user = www
group = www
listen = /tmp/php-cgi-xxx.sock
listen.owner = www
listen.group = www
listen.mode = 0666
pm = dynamic
pm.max_children = 2
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 2
pm.max_requests = 1000
php_admin_value[memory_limit] = 1024M
php_admin_value[max_execution_time] = 300

这里要注意,/tmp/php-cgi-xxx.sock要与「配置文件」中的一致!别改了前面的xxx,这里的xxx忘记了。

然后重启php,重启nginx,这两个重启直接点开「已安装」中对应的php和nginx,点击重启即可。

怎么才知道自己有没有给新站点弄好pool呢?

最简单的就是打开自己的网站,看下站点有没有正常访问,然后也可以打开终端,输入:

ps aux | grep php-fpm

看到php-cgi-xxx.sock即可。

另外还要注意这几个值的配置,

pm.max_children = 2
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 2
pm.max_requests = 1000
php_admin_value[memory_limit] = 1024M
php_admin_value[max_execution_time] = 300

这几个值控制了网站的卡不卡,为了更好的生成,我用ai制作了一个shell脚本,能根据访问日志获取访问量,结合vps的配置给出一套方案:

#!/bin/bash
echo "=== 基于硬件和访问日志的PHP-FPM智能配置生成器 ==="

# 获取硬件信息
CPU_CORES=$(nproc)
TOTAL_MEMORY_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
TOTAL_MEMORY_MB=$((TOTAL_MEMORY_KB / 1024))
TOTAL_MEMORY_GB=$((TOTAL_MEMORY_MB / 1024))

echo "=== 硬件配置检测 ==="
echo "CPU核心数: $CPU_CORES"
echo "总内存: ${TOTAL_MEMORY_MB}MB (${TOTAL_MEMORY_GB}GB)"
echo ""

# 配置参数
# 动态输入域名
read -p "请输入要分析的域名: " SITE_DOMAIN

if [ -z "$SITE_DOMAIN" ]; then
    echo "错误:域名不能为空"
    exit 1
fi
LOG_FILE="/www/wwwlogs/${SITE_DOMAIN}.log"
TODAY=$(date +"%d/%b/%Y")

# 检查日志文件
if [ ! -f "$LOG_FILE" ]; then
    echo "错误:日志文件 $LOG_FILE 不存在"
    exit 1
fi

echo "正在分析 $SITE_DOMAIN 的访问日志..."
echo "分析日期: $TODAY"
echo ""

# 1. 基础数据采集
echo "=== 访问量分析 ==="
TOTAL_REQUESTS=$(grep "$TODAY" "$LOG_FILE" | wc -l)
HTML_REQUESTS=$(grep "$TODAY" "$LOG_FILE" | grep -v -E '\.(css|js|jpg|jpeg|png|gif|svg|ico|woff|ttf|pdf|zip)' | wc -l)
MAIN_PAGES=$(grep "$TODAY" "$LOG_FILE" | grep -E '"GET /( |/index|/about|/contact|/product)' | wc -l)
UNIQUE_IPS=$(grep "$TODAY" "$LOG_FILE" | awk '{print $1}' | sort | uniq | wc -l)

echo "总请求数: $TOTAL_REQUESTS"
echo "HTML页面请求: $HTML_REQUESTS"
echo "主要页面访问: $MAIN_PAGES"
echo "独立IP数: $UNIQUE_IPS"

# 2. 峰值分析
echo ""
echo "=== 峰值流量分析 ==="
PEAK_HOUR_COUNT=$(grep "$TODAY" "$LOG_FILE" | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr | head -1 | awk '{print $1}')
PEAK_HOUR_TIME=$(grep "$TODAY" "$LOG_FILE" | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr | head -1 | awk '{print $2}')

echo "峰值小时: ${PEAK_HOUR_TIME}:00 = $PEAK_HOUR_COUNT 次请求"

# 峰值分钟计算
PEAK_MINUTE=$(grep "$TODAY:$PEAK_HOUR_TIME" "$LOG_FILE" | awk '{print $4}' | cut -d: -f3 | sort | uniq -c | sort -nr | head -1 | awk '{print $1}')
[ -z "$PEAK_MINUTE" ] && PEAK_MINUTE=0
echo "峰值分钟: $PEAK_MINUTE 次请求"

# 3. 业务流量分析
BUSINESS_PEAK_HOUR=$(grep "$TODAY" "$LOG_FILE" | grep -v -E '\.(css|js|jpg|jpeg|png|gif|svg|ico|woff|ttf)' | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr | head -1 | awk '{print $1}')
[ -z "$BUSINESS_PEAK_HOUR" ] && BUSINESS_PEAK_HOUR=0
echo "业务峰值小时: $BUSINESS_PEAK_HOUR 次页面请求"

# 4. 基于硬件的约束计算
echo ""
echo "=== 硬件约束分析 ==="

# CPU约束:理想进程数 = CPU核心数 × 2-4
CPU_OPTIMAL_PROCESSES=$((CPU_CORES * 3))
echo "基于CPU的理想进程数: $CPU_OPTIMAL_PROCESSES (${CPU_CORES}核 × 3)"

# 内存约束计算
# 保留50%内存给系统和其他服务
AVAILABLE_MEMORY_MB=$((TOTAL_MEMORY_MB / 2))
echo "可用于PHP-FPM的内存: ${AVAILABLE_MEMORY_MB}MB (总内存的50%)"

# 根据流量确定单进程内存需求
if [ $HTML_REQUESTS -gt 1000 ]; then
    MEMORY_PER_PROCESS=384
    TRAFFIC_LEVEL="高"
elif [ $HTML_REQUESTS -gt 500 ]; then
    MEMORY_PER_PROCESS=256
    TRAFFIC_LEVEL="中等"
else
    MEMORY_PER_PROCESS=128
    TRAFFIC_LEVEL="低"
fi

# 基于内存约束的最大进程数
MEMORY_CONSTRAINED_PROCESSES=$((AVAILABLE_MEMORY_MB / MEMORY_PER_PROCESS))
echo "基于内存约束的最大进程数: $MEMORY_CONSTRAINED_PROCESSES (${AVAILABLE_MEMORY_MB}MB ÷ ${MEMORY_PER_PROCESS}MB)"

# 5. 业务需求计算
echo ""
echo "=== 业务需求分析 ==="

# 计算并发需求
CONCURRENT_PER_SECOND=$((($PEAK_MINUTE + 59) / 60))
[ $CONCURRENT_PER_SECOND -lt 1 ] && CONCURRENT_PER_SECOND=1
echo "峰值并发: $CONCURRENT_PER_SECOND 请求/秒"

# 估算页面处理时间
PAGE_PROCESS_TIME=3
echo "估算页面处理时间: ${PAGE_PROCESS_TIME}秒"

# 理论进程需求
THEORETICAL_PROCESSES=$(($CONCURRENT_PER_SECOND * $PAGE_PROCESS_TIME))
echo "理论进程需求: $THEORETICAL_PROCESSES"

# 6. 综合决策算法
echo ""
echo "=== 智能配置决策 ==="

# 取最小值作为安全上限
HARDWARE_LIMIT=$((CPU_OPTIMAL_PROCESSES < MEMORY_CONSTRAINED_PROCESSES ? CPU_OPTIMAL_PROCESSES : MEMORY_CONSTRAINED_PROCESSES))
echo "硬件安全上限: $HARDWARE_LIMIT 个进程"

# 业务需求与硬件约束的平衡
if [ $THEORETICAL_PROCESSES -le $HARDWARE_LIMIT ]; then
    RECOMMENDED_MAX_CHILDREN=$((THEORETICAL_PROCESSES + 2))  # 加2个安全系数
    DECISION_REASON="基于业务需求"
else
    RECOMMENDED_MAX_CHILDREN=$HARDWARE_LIMIT
    DECISION_REASON="受硬件限制"
fi

# 最终边界检查
[ $RECOMMENDED_MAX_CHILDREN -lt 2 ] && RECOMMENDED_MAX_CHILDREN=2
[ $RECOMMENDED_MAX_CHILDREN -gt 20 ] && RECOMMENDED_MAX_CHILDREN=20

echo "最终推荐进程数: $RECOMMENDED_MAX_CHILDREN ($DECISION_REASON)"

# 计算其他参数
RECOMMENDED_START_SERVERS=$(($RECOMMENDED_MAX_CHILDREN * 2 / 5))
[ $RECOMMENDED_START_SERVERS -lt 1 ] && RECOMMENDED_START_SERVERS=1
[ $RECOMMENDED_START_SERVERS -gt $RECOMMENDED_MAX_CHILDREN ] && RECOMMENDED_START_SERVERS=$RECOMMENDED_MAX_CHILDREN

RECOMMENDED_MIN_SPARE=$(($RECOMMENDED_START_SERVERS / 2))
[ $RECOMMENDED_MIN_SPARE -lt 1 ] && RECOMMENDED_MIN_SPARE=1

RECOMMENDED_MAX_SPARE=$(($RECOMMENDED_START_SERVERS + 2))
[ $RECOMMENDED_MAX_SPARE -gt $RECOMMENDED_MAX_CHILDREN ] && RECOMMENDED_MAX_SPARE=$RECOMMENDED_MAX_CHILDREN

# 内存配置(基于硬件优化)
MEMORY_LIMIT="${MEMORY_PER_PROCESS}M"

# 执行时间
EXEC_TIME=$((BUSINESS_PEAK_HOUR > 100 ? 300 : 120))

# 7. 生成最终配置
echo ""
echo "=== 智能生成的配置建议 ==="
echo "# 硬件: ${CPU_CORES}核CPU, ${TOTAL_MEMORY_MB}MB内存"
echo "# 访问: $HTML_REQUESTS次HTML请求, 流量等级: $TRAFFIC_LEVEL"
echo "# 峰值: $PEAK_HOUR_COUNT/小时, $PEAK_MINUTE/分钟, ${CONCURRENT_PER_SECOND}/秒"
echo "# 决策: $DECISION_REASON, 安全配置"
echo ""
echo "pm = dynamic"
echo "pm.max_children = $RECOMMENDED_MAX_CHILDREN        # ${TRAFFIC_LEVEL}流量站点,${DECISION_REASON}"
echo "pm.start_servers = $RECOMMENDED_START_SERVERS"
echo "pm.min_spare_servers = $RECOMMENDED_MIN_SPARE"
echo "pm.max_spare_servers = $RECOMMENDED_MAX_SPARE"
echo "pm.max_requests = 500"
echo "php_admin_value[memory_limit] = $MEMORY_LIMIT"
echo "php_admin_value[max_execution_time] = $EXEC_TIME"

# 8. 资源评估和警告
echo ""
echo "=== 资源评估 ==="
TOTAL_MEMORY_USAGE=$(($RECOMMENDED_MAX_CHILDREN * MEMORY_PER_PROCESS))
MEMORY_USAGE_PERCENT=$((TOTAL_MEMORY_USAGE * 100 / TOTAL_MEMORY_MB))

echo "最大内存需求: ${TOTAL_MEMORY_USAGE}MB"
echo "内存使用率: ${MEMORY_USAGE_PERCENT}%"

# 安全性检查
echo ""
echo "=== 安全性检查 ==="
if [ $MEMORY_USAGE_PERCENT -gt 70 ]; then
    echo "⚠️  警告:内存使用率超过70%,建议升级服务器内存"
elif [ $MEMORY_USAGE_PERCENT -gt 50 ]; then
    echo "✅ 内存使用合理,但建议监控"
else
    echo "✅ 内存使用安全"
fi

if [ $RECOMMENDED_MAX_CHILDREN -gt $((CPU_CORES * 4)) ]; then
    echo "⚠️  警告:进程数过多,可能影响CPU性能"
else
    echo "✅ 进程数与CPU核心数匹配"
fi

echo ""
echo "=== 使用说明 ==="
echo "1. 将上述配置添加到 /www/server/php/83/etc/php-fpm.conf 的 [xxx] 池中"
echo "2. 重启PHP-FPM: systemctl restart php83-php-fpm"
echo "3. 重启Nginx: systemctl restart nginx"
echo "4. 监控效果: watch -n 3 \"ps aux | grep 'pool xxx'\""
echo "5. 内存监控: free -h"
echo "6. 负载监控: uptime"

代码保存为vpsCount.sh,然后运行,之后输入域名即可。

Keen

Keen

分享英文建站和SEO技巧.

按ESC退出