我是Nginx的新手,我正在努力让子域工作。
我想做的是接受我的域名(让我们称之为example.com
)并添加:
sub1.example.com
,sub2.example.com
,还有www.example.com
可用。我知道如何用Apache做到这一点,但是Nginx真的很头疼。
我正在运行Debian 6.
我当前的/etc/nginx/sites-enabled/example.com:
server {
server_name www.example.com example.com;
access_log /srv/www/www.example.com/logs/access.log;
error_log /srv/www/www.example.com/logs/error.log;
root /srv/www/www.example.com/public_html;
location / {
index index.html index.htm;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/www.example.com/public_html$fastcgi_script_name;
}
}
它正在努力为example.com和www.example.com提供服务。
我尝试在同一个文件中添加第二个服务器块,如:
server {
server_name www.example.com example.com;
access_log /srv/www/www.example.com/logs/access.log;
error_log /srv/www/www.example.com/logs/error.log;
root /srv/www/www.example.com/public_html;
server {
server_name sub1.example.com;
access_log /srv/www/example.com/logs/sub1-access.log;
error_log /srv/www/example.com/logs/sub1-error.log;
root /srv/www/example.com/sub1;
}
location / {
index index.html index.htm;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/www.example.com/public_html$fastcgi_script_name;
}
}
没有运气。有任何想法吗?我非常感谢任何反馈。
答案 0 :(得分:71)
错误是将服务器块放在服务器块内,您应关闭主服务器块,然后为子域打开一个新的
server {
server_name example.com;
# the rest of the config
}
server {
server_name sub1.example.com;
# sub1 config
}
server {
server_name sub2.example.com;
# sub2 config
}
答案 1 :(得分:3)
您只需添加以下行代替server_name
server_name xyz.com *.xyz.com;
然后重启Nginx。就是这样。
答案 2 :(得分:1)
您必须为您的子域创建另一个带有服务器块的nginx配置文件。像这样:
/etc/nginx/sites-enabled/subdomain.example.com
答案 3 :(得分:1)
为DNS提供程序中的每个域添加 A 字段,并带有 sub1.example.com 和 sub2.example.com
设置服务器。最后保留 example.com
如下
server {
server_name sub1.example.com;
# sub1 config
}
server {
server_name sub2.example.com;
# sub2 config
}
server {
server_name example.com;
# the rest of the config
}
sudo systemdctrl restart nginx
答案 4 :(得分:0)
也许这可以帮助遇到这个问题的人,这让我磨了一整天。 首先,如果您安装了 SSL,请将其删除(最好还是删除),这将有助于重置之前破坏子域配置的配置。
在 etc/nginx/.../default 文件中 创建一个新的服务器块
server {
listen 80;
server_name subdomain.domain.com;
location /{
proxy_pass http://localhost:$port;
}
}
答案 5 :(得分:-1)
有一个非常可定制的解决方案,具体取决于您的服务器实现:
在一个nginx“站点”文件中有两个(或更多)子域?如果您拥有通配TLS证书,那么很好,因此想要维护一个nginx配置文件。所有使用相同服务但使用不同端口的端口? (考虑到同时运行的不同应用版本,每个版本都在本地监听不同的端口)
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ~^(?<sub>.+).example.com;
# default app (the "default" ports, good for the "old" app)
set $app 19069;
set $app-chat 19072;
# new app
# new.example.com
if ( $sub = "new" ) {
set $app 18069;
set $app-chat 18072;
}
# upstreaming
location / {
proxy_redirect off;
proxy_pass http://127.0.0.1:$app;
}
location /longpolling {
proxy_pass http://127.0.0.1:$app-chat;
}
我知道性能会“糟透了”,但是话又说回来,因为决定只使用一台服务器,这就像在抱怨一个经济型盒子不能像公共汽车那样拖拉太多的人,因为那辆小汽车“重”了。顶部的车顶架。
正则表达式专家可以潜在地提高这种自定义解决方案的性能,特别是因为它可以省略CPU昂贵的“ if”条件语句。