在共享主机子目录域中运行远程应用程序

时间:2016-11-21 18:26:52

标签: apache

我已经构建了一个在自定义域名的VPS中运行的应用:myapp.mainsite.com。

http://mainsite.com生活在共享主机环境中。现在我的客户想要使用子目录作为应用程序的主要网址,例如:http://mainsite.com/myapp

因此,当有人输入http://myapp.mainsite.com时,系统会将用户重定向到http://mainsite.com/myapp网址。

共享主机和vps实例正在使用apache2作为应用服务器。

问题在于我不知道如何做上述事情。我读过关于apache的proxy_pass但没有真正理解如何去做。

编辑:只是为了澄清事情,用户必须查看导航位置为http://mainsite.com/myapp的网址。

这是vps实例的apache配置:

WSGISocketPrefix /var/run/wsgi
<VirtualHost 0.0.0.0:8080>
    ServerName {{ VPS IP }}
    ServerAlias {{ VPS IP }}
    WSGIScriptAlias / /etc/ckan/default/apache.wsgi

    # pass authorization info on (needed for rest api)
    WSGIPassAuthorization On

    # Deploy as a daemon (avoids conflicts between CKAN instances)
    WSGIDaemonProcess ckan_default display-name=ckan_default processes=2 threads=15

    WSGIProcessGroup ckan_default

    ErrorLog /var/log/apache2/ckan_default.error.log
    CustomLog /var/log/apache2/ckan_default.custom.log combined

    <Directory />
        Require all granted
    </Directory>
</VirtualHost>

nginx one:

proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache:30m max_size=250m;
proxy_temp_path /tmp/nginx_proxy 1 2;

server {
    server_name myapp.mainsite.com;
    client_max_body_size 100M;
    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_cache cache;
        proxy_cache_bypass $cookie_auth_tkt;
        proxy_no_cache $cookie_auth_tkt;
        proxy_cache_valid 30m;
        proxy_cache_key $host$scheme$proxy_host$request_uri;
        # In emergency comment out line to force caching
        # proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
    }

}

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您目前正在为您的应用提供VPS:

                    +----------------------------------+
myapp.mainsite.com  | +----------+     +-------------+ |
+---------------------> nginx:80 +-----> apache:8080 | |
                    | +----------+     +-------------+ |
                    |              VPS                 |
                    +----------------------------------+

你想要:

  • 将用户重定向到mainsite.com/myapp
  • /myapp您的应用
  • 上投放

就像那样:

                    +----------------------------------+
      mainsite.com  | +---------------+  / as usual    |
+---------------------> apache:80 (?) | +---------> …  |
                    | +---------------+                |         +---------+
                    |                    /myapp        |         |         |
                    |                   +----------------------> |  VPS    |
                    |          shared host             |         |         |
                    +----------------------------------+         +---------+

第1步,重定向用户

在您的VPS上,在nginx中:

server {
    server_name myapp.mainsite.com;

    location / {
        return 301 http://mainsite.com/myapp/;
    }

    location /myapp/ {
        proxy_pass http://127.0.0.1:8080/myapp/;
        # …
    }
}

有关location /myapp/的解释,请参阅下文。

步骤2,代理从共享主机到VPS的请求

在共享主机上,在apache配置中添加:

<Location /myapp/>
    ProxyPass http://myapp.mainsite.com/myapp/
    ProxyPassReverse http://myapp.mainsite.com/myapp/
</Location>

第3步,(尝试)更新/myapp/

的应用

当您代理请求时,保持相同路径会更容易:例如,将/代理到//myapp/代理到/myapp。如果您将/a代理到/b/c,则代理本身需要重写回复:<img src="/a/test.png">需要更改为<img src="/b/c/test.png">。或worse<img src="../c/test.png" />。在html,js和css中添加相对引用。这是可行的,但它可以使用正则表达式并且容易出错(mod_proxy_html将帮助您在apache 2.4)。

如果你可以让你的应用程序在/myapp/上运行,那么你(几乎)已经完成了(我没有测试过这个解决方案,所以第一次可能不会神奇地工作)。

如果没有,请在代理声明中删除/myapp/,祝你好运!

另一个问题:这个解决方案(应该)有效,因为ProxyPass指令使用myapp.mainsite.com,它将匹配VPS上的nginx vhost。如果您的应用程序使用主机(生成网址,重定向等),这将无法正常工作(因为您将myapp.mainsite.com发送给用户而不是mainsite.com)。在这种情况下,在apache(共享主机)代理中使用ProxyPreserveHost并在nginx(vps)中创建另一个vhost来处理mainsite.com

相关问题