我从 DigitalOcean 购买了一台专用服务器,并配置了nginx
、mysql 和 php,其 IP 地址为a.b.c.d
。我从和买了两个域名GoDaddy
。我创建了一个子域名,它将是一个网站。我在 中将转发到。siteone.com
sitetwo.com
sub.siteone.com
WordPress
sub.siteone.com
a.b.c.d
GoDaddy
依照指示这个帖子和这个帖子,我把WordPress文件放在了 下/var/www/sub.siteone.com/html/
。/etc/nginx/sites-available/sub.siteone.com
包含以下内容:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /var/www/sub.siteone.com/html;
index index.php index.html index.htm;
server_name sub.siteone.com;
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
结果,当我进入sub.siteone.com
浏览器时,它会重定向到a.b.c.d
并显示 WordPress 网站。
问题是我希望我的服务器 ( a.b.c.d
) 包含多个站点(即域)。因此,我设想的机制是a.b.c.d/one/
包含第一个域,并a.b.c.d/two/
包含第二个域。结果,
- 当我
sub.siteone.com
在浏览器中输入时,url 保持不变,但内容来自a.b.c.d/one/
; - 当我在浏览器中输入例如时
sub.siteone.com/photos/
,url 保持不变,而内容来自a.b.c.d/one/photos
; - 当我
sitetwo.com
在浏览器中输入时,url 保持不变,但内容来自a.b.c.d/two/
; - 当我在浏览器中输入例如时
sitetwo.com/downloads/
,url 保持不变,而内容来自a.b.c.d/two/downloads
有人能告诉我这种机制是否有意义吗?我该如何修改 nginx 和 GoDaddy 的设置来实现这一点?
答案1
您可以使用 Nginx 中的服务器块轻松实现此目的,以创建多个“虚拟主机”,每个虚拟主机都有不同的 HTTP 配置。这是因为 Nginx 根据您用于访问服务器的 URL 以不同的方式处理您的请求。
简单来说,要访问 siteone.com,您需要创建一个server
值为server_name
的块siteone.com
。每个服务器块可以位于其自己的文件中,也可以位于同一个文件中,这并不重要。
siteone.com:
server {
listen 80;
server_name sub.siteone.com;
root /var/www/sub.siteone.com/html;
# ADD ADDITIONAL SITEONE CONFIGURATION HERE
}
sub.siteone.com:
server {
listen 80;
server_name sub.siteone.com;
root /var/www/sub.siteone.com/html;
# ADD ADDITIONAL SUB.SITEONE CONFIGURATION HERE
}
sitetwo.com
server {
listen 80;
server_name sitetwo.com;
root /var/www/sitetwo.com/html;
# ADD ADDITIONAL SITETWO CONFIGURATION HERE
}
这应该能提供您需要的行为。还值得注意的是,除了为每个服务器使用不同的根目录之外,您还可以做很多事情,为每个虚拟主机设置不同的日志文件、转发请求和许多其他功能也很有用。
以下是 sitetwo.com 特定日志文件的粗略示例
server {
listen 80;
server_name sitetwo.com;
root /var/www/sitetwo.com/html;
error_log /var/www/sitetwo.com/logs/error.log;
access_log /var/www/sitetwo.com/logs/access.log;
# ADD ADDITIONAL SITETWO CONFIGURATION HERE
}
答案2
你想要的就是虚拟主机。它的效果比你描述的要好得多!
只需添加server
具有不同目录的多个块server_name
即可root
。server
每个域名一个块。请注意,只能将其中一个标记为,default_server
但除此之外,所有块看起来都可以相同。
最好的方法是为每个站点创建一个文件,然后将每个文件符号链接到/etc/nginx/sites-enabled/
。完成后,使用以下命令重新启动 nginx:service nginx restart
答案3
使用 Nginx,您应该根据需要创建尽可能多的站点配置文件,并简单修改 server_name 和 root 语句以将外部域映射到其内容和代码。
答案4
Ben 的回答也很好,这里有一个替代方案,只是为了多样性:创建一个服务器并在其中添加指向您网站位置的多个位置块。
服务器{
listen 443 ssl;
server_name dev.domainofmysite.com;
server_tokens off;
location /param {
proxy_pass http://127.0.0.1:8888;
}
location /tparam {
proxy_pass http://127.0.0.1:7172;
}
location /dparam {
proxy_pass http://127.0.0.1:7172;
}
}