我已经使用fastcgi_mono_server4配置了nginx。 在我的nginx配置中,我有2个主机名:
server {
listen 80;
server_name dev.example.org
location / {
root /var/www/dev.example.org/;
fastcgi_index Default.aspx;
fastcgi_pass 127.0.0.1:9001;
include /etc/nginx/fastcgi_params;
}
}
server {
listen 80;
server_name *.example.org
location / {
root /var/www/example.org/;
fastcgi_index Default.aspx;
fastcgi_pass 127.0.0.1:9000;
include /etc/nginx/fastcgi_params;
}
}
nginx可以使用此配置。 dev去了一个,另一个到另一个。
我已经尝试过了:
fastcgi-mono-server4 /applications=*.example.org:/:/var/www/example.org/ /socket=tcp:127.0.0.1:9000
但它会抛出错误(Uri解析异常)
更新 我需要在我的应用程序中获取完整的主机名,例如,如果请求是abc.example.org,我需要获得“abc”。 不幸的是,HttpContext.Current.Request.Url不包含“abc”而是“*”导致解析错误
答案 0 :(得分:1)
如果nginx将负责将相应的子域路由到每个fastcgi端口(9000或9001),那么当您启动单声道服务器进程时,您可以使用通配符域。只需使用*而不是'* .example.org'
fastcgi-mono-server4 /applications=*:/:/var/www/example.org/ /socket=tcp:127.0.0.1:9000
更新:上述方法可以让两个Mono服务器应用程序通过nginx进行监听,但是,如果您在原始问题上调用HttpContext.Request.Url
,则使用原始问题中的nginx配置会导致异常全能服务器。这是因为它不喜欢*
中的*.example.org
。
有两种可能的解决方案,具体取决于您希望在客户浏览HttpContext.Request.Url
,foo.example.org
等时从bar.example.org
返回的内容。
选项1:如果您不关心子域并希望看到example.org
将第二个(*.example.org
)nginx服务器配置为'default_server',并让它分配不带通配符的服务器名称,例如。
server {
listen 80 default_server;
server_name example.org;
access_log ... }
使用这些设置,浏览到foo.example.org/Default.aspx
会加载页面,HttpContext.Request.Url
会返回example.org/Default.aspx
选项2:如果您想查看实际的子域,例如foo.example.org
从第二个服务器定义中删除server_name。
server {
listen 80 default_server;
access_log ... }
使用这些设置,浏览到foo.example.org/Default.aspx
会加载页面,HttpContext.Request.Url
会返回foo.example.org/Default.aspx
答案 1 :(得分:0)
@ stephen的答案更简单,不需要fastcgi配置修改。
我尝试了之前的回答(更新前),但它没有用。 正如@stephen所说,Nginx负责路由,并且路由部分工作正常。
启动fastcgi我使用此命令匹配所有路由(和服务器名称)
fastcgi-mono-server4 /applications=/:/var/www/example.org/ /socket=tcp:127.0.0.1:9000
问题是HttpContext.Request.Url在我的情况下包含$ server_name值,它是“* .example.org”,当我尝试解析URI时出现错误。
为了解决这个问题,我改变了nginx fastcgi_params并取代了这行
fastcgi_param SERVER_NAME $server_name;
通过
fastcgi_param SERVER_NAME $http_host;
并添加site-available conf
proxy_set_header Host $host;
我认为它是默认设置的。
重新加载nginx
nginx -t && service nginx reload
重新加载fastcgi-mono-server进行测试
fastcgi-mono-server4 /applications=/://var/www/example.org/ /socket=tcp:127.0.0.1:9000 /printlog=True /loglevels=Debug
日志SERVER_NAME中的包含真实(非*)子域。