我已经构建了一个在自定义域名的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;
}
}
答案 0 :(得分:1)
如果我理解正确,您目前正在为您的应用提供VPS:
+----------------------------------+
myapp.mainsite.com | +----------+ +-------------+ |
+---------------------> nginx:80 +-----> apache:8080 | |
| +----------+ +-------------+ |
| VPS |
+----------------------------------+
你想要:
/myapp
您的应用就像那样:
+----------------------------------+
mainsite.com | +---------------+ / as usual |
+---------------------> apache:80 (?) | +---------> … |
| +---------------+ | +---------+
| /myapp | | |
| +----------------------> | VPS |
| shared host | | |
+----------------------------------+ +---------+
在您的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/
的解释,请参阅下文。
在共享主机上,在apache配置中添加:
<Location /myapp/>
ProxyPass http://myapp.mainsite.com/myapp/
ProxyPassReverse http://myapp.mainsite.com/myapp/
</Location>
/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
。