首页 > 解决方案 > 如何在 Plesk 上为特定域创建 nginx 自定义模板?

问题描述

我知道 plesk 允许我们在文件夹下创建自定义 Nginx 和 Apache 模板,/usr/local/psa/admin/conf/templates/custom但 Plesk 没有提供任何选项来为每个域指定自定义模板。

https://talk.plesk.com/threads/nginx-vhost-template-for-a-specific-domain.342876/

我有一个运行在端口 3001 上的 nodeJs 应用程序和运行在端口 3002 上的 websocket,所以我需要为这两种情况配置一个特定的反向代理。

如果域是 a.domain.com,我需要代理将流量转发到 3001 端口。如果域是 b.domain.com 我需要代理将流量转发到 3002 端口。

其他任何事情,apache 端口的常见行为。

有什么办法可以做到这一点?

标签: nginxreverse-proxyplesk

解决方案


我解决了这个案例,在 plesk 自定义模板上添加了一些逻辑。

首先,在 /usr/local/psa/admin/conf/templates/ 上创建一个新文件夹custom

mkdir -p /usr/local/psa/admin/conf/templates/custom/domain/service/

然后,使用以下代码创建一个文件:

vim /usr/local/psa/admin/conf/templates/custom/domain/service/proxy.php

<?php
/**
 * @var Template_VariableAccessor $VAR
 * @var array $OPT
 */
?>
<?php
$port = $OPT['backendPort'];
if($VAR->domain->asciiName == 'a.domain.com') {
        $port =  '3001';
}
else if ($VAR->domain->asciiName == 'b.domain.com') {
        $port = '3002';
}
?>

<?php if ($OPT['ssl'] && ($port == 3002 || $port == 3001)): ?>
        proxy_pass http://<?php echo $OPT['ipAddress']->proxyEscapedAddress . ':' . $port ?>;
<?php elseif ($OPT['ssl'] && ($port != 3002 && $port != 3001)): ?>
        proxy_pass https://<?php echo $OPT['ipAddress']->proxyEscapedAddress . ':' . $port ?>;
<?php else: ?>
        proxy_pass http://<?php echo $OPT['ipAddress']->proxyEscapedAddress . ':' . $port ?>;
<?php endif ?>
        proxy_set_header Host             $host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
<?php if (empty($OPT['nginxTransparentMode']) && !$VAR->domain->physicalHosting->proxySettings['nginxTransparentMode'] && !$VAR->domain->physicalHosting->proxySettings['nginxServeStatic']): ?>
        proxy_set_header X-Accel-Internal /internal-nginx-static-location;
<?php endif ?>
        access_log off;

<?php if ($OPT['nginxCacheEnabled'] ?? true): ?>
    <?=$VAR->includeTemplate('domain/service/nginxCacheProxy.php', $OPT)?>
<?php endif ?>

现在,只需休息以运行重新配置脚本:

/usr/local/psa/admin/bin/httpdmng --reconfigure-domain a.domain.com
/usr/local/psa/admin/bin/httpdmng --reconfigure-domain b.domain.com

推荐阅读