Tại sao Apache có thể bỏ qua máy chủ ảo có Tên máy chủ khớp với URL được yêu cầu?


26

Tôi đang cố gắng thêm máy chủ ảo thứ hai vào cấu hình apache của mình, nhưng dường như không thể sử dụng máy chủ ảo mới.

Của tôi httpd.confchỉ chứa dòng sau:

ServerName radiofreebrighton.org.uk

Tôi cũng có một ports.conftập tin, chứa những thứ sau đây:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

Tôi có hai tệp sites-availableđược liên kết đến sites-enabledbởi a2ensite:

  • radiofreebrighton.org.uk
  • trafalgararches.co.uk

Nội dung của thứ nhất là:

<VirtualHost _default_:80>
    DocumentRoot /home/tom/www

    ServerAdmin tom@radiofreebrighton.org.uk
    ServerName radiofreebrighton.org.uk
    ServerAlias www.radiofreebrighton.org.uk

    <Directory /home/tom/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log
    LogLevel error
    CustomLog /var/log/apache2/access.log combined

    Alias /wiki /home/tom/www/mediawiki/index.php
</VirtualHost>

Nội dung của phần sau là:

<VirtualHost *:80>
    DocumentRoot /home/tom/tata-www

    ServerAdmin admin@trafalgararches.co.uk
    ServerName trafalgararches.co.uk
    ServerAlias www.trafalgararches.co.uk

    <Directory /home/tom/tata-www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    logLevel error
    ErrorLog /var/log/apache2/error.log
</VirtualHost>

Nhưng bất cứ khi nào tôi yêu cầu một trang từ trafalgararches.co.uk, tôi sẽ nhận được một trang từ radiofreebrighton.org.uk. Tại sao điều này có thể xảy ra? Làm thế nào tôi có thể sửa chữa nó?


Chỉnh sửa:

Cấu hình máy chủ ảo được hiểu bởi apache:

tom@rfb:/usr/local$ apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost trafalgararches.co.uk (/etc/apache2/sites-enabled/trafalgararches.co.uk:1)
Syntax OK

(Lượm lặt qua apache2ctl -Saka httpd -S.)


1
Không chắc chắn đây là nguyên nhân, nhưng bạn nên loại bỏ các dấu gạch chéo từ đầu ServerNameServerAliasdòng của bạn . Ngoài ra, hãy chắc chắn rằng bạn đã khởi động lại apache.
EEAA

Tôi gần như tích cực đó là nguyên nhân. Điều đó có nghĩa là tên máy chủ trong yêu cầu sẽ không bao giờ khớp với Tên máy chủ cho máy chủ ảo đó.
larsks

1
@ErikA, @larsks - Các bạn đã hy vọng của tôi lên! Tôi đã xóa dấu gạch chéo và khởi động lại apache, nhưng nó không thay đổi gì cả.
Tom Wright

1
Bạn có NameVirtualHost *:80một nơi nào đó trong cấu hình của bạn?
larsks

1
Tôi không chắc các trang web được đề cập ở trên là sản xuất hay phát triển, nhưng thực sự việc truy cập các URL đó sẽ cung cấp cho tôi hai trang khác nhau (các trang chính xác bởi vẻ ngoài của nó). Nếu các vhost ở trên là trên một máy chủ phát triển, hãy bỏ qua nhận xét này. Nếu không, bạn có thể đã khắc phục sự cố của mình ở đâu đó trên đường đi và vẫn có một bản sao được lưu trong bộ nhớ cache.
cyberx86

Câu trả lời:


15

Chà, câu hỏi này đã hơn một năm tuổi, nhưng tôi đã vấp phải "vấn đề" tương tự. Điều này có thể rõ ràng, nhưng đừng quên khởi động lại dịch vụ apache sau khi bật máy chủ ảo bổ sung. Xem, sau khi thực hiện a2ensitecho máy chủ ảo thứ hai, đầu ra của apache2ctl -Ssẽ hiển thị rằng cả hai trang đều khả dụng (và một trong số đó là mặc định), ngay cả khi bạn không tải lại apache.

Giả sử bạn có hai máy chủ ảo - site1 và site2. Bạn chạy a2ensite site1và sau đó tải lại dịch vụ apache. Bây giờ bạn có thể truy cập http://site1và nó là mặc định. Bây giờ bạn chạy a2ensite site2, nhưng quên khởi động lại apache. Đầu ra của apache2ctl -Ssẽ là:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site2 (/etc/apache2/sites-enabled/site2:1)
Syntax OK

Nhưng khi bạn cố tải http://site2, nó thực sự sẽ tải trang mặc định (site1), vì cấu hình không được tải.


Tôi nhận được cùng một đầu ra nhưng thậm chí sau đó nó không tải trang web thứ hai.
arqam

15

Tôi gặp vấn đề tương tự khi các vhost bổ sung của tôi trên cổng 443 (SSL / HTTPS) đều được chuyển đến thư mục của vhost đầu tiên được liệt kê. Về cơ bản, Apache đã bỏ qua thuộc tính tên máy chủ và chỉ khớp trên cổng ip :.

Hóa ra tôi đã thiếu lệnh 'NameVirtualhost *: 443' để kích hoạt lưu trữ ảo được đặt tên cho cổng 443.

'NameVirtualhost *: 443' chỉ cần được gọi một lần và phải được xác định phía trên vhost của bạn cho cổng 443. Tôi đặt định nghĩa của mình trong tệp port.config để nó trông giống như:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

Đừng quên khởi động lại apache sau bất kỳ thay đổi.


1
Để biết giá trị của nó ... trong Apache 2.4.18, sử dụng NameVirtualHosttạo ra thông báo này khi khởi động:AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf
Lambart

4

2 xu của tôi: vì tôi phải gắn IP (tôi không muốn trang web được phục vụ trên tất cả các mạng được cài đặt), nên sau khi IP riêng của máy chủ thay đổi, tôi đã quên thay đổi tại đây:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

Tất nhiên, đó không phải là vấn đề của Apache để cho bạn biết rằng IP không tồn tại cục bộ.


2

Tom, xin vui lòng xem tại đây http://httpd.apache.org/docs/2.0/en/mod/core.html#namevirtualhost

chú thích

Lưu ý rằng "máy chủ chính" và bất kỳ máy chủ mặc định nào sẽ không bao giờ được cung cấp cho yêu cầu tới địa chỉ IP NameVirtualhost (trừ khi vì lý do nào đó bạn chỉ định NameVirtualhost nhưng sau đó không xác định bất kỳ Virtualhost nào cho địa chỉ đó).

Vì vậy, nó sẽ ổn nếu bạn thay đổi mặc định thành địa chỉ ip của máy chủ của bạn.


Tôi đã thử điều đó, nhưng nó chẳng thay đổi gì cả. Tôi cũng muốn tránh tự trói mình vào một IP cụ thể, vì vậy tôi sẽ thay đổi lại. Ngoài ra, tôi nên chỉ ra rằng vhost mặc định là cái hoạt động.
Tom Wright

1

Tôi tìm thấy câu trả lời từ đây: http://alexking.org/blog/2007/11/01/apache-2-only-serves-first-virtual-host

Đặt 2 tên máy chủ vào cùng 1 thẻ Virtualhost như dưới đây:

<VirtualHost *:80>
ServerName beta-site-1.com
DocumentRoot "/Library/WebServer/beta-site-1"

ServerName beta-site-2.com
DocumentRoot "/Library/WebServer/beta-site-2"
</VirtualHost>

Cuối cùng tôi đã gặp sự cố với trang web thứ hai vì tôi có hai khối thẻ Virtualhost.


0

Tôi gặp vấn đề này khi di chuyển các trang web sang máy chủ Ubuntu 16 mới. Sau một chút đau đầu, tôi nhận ra Mô-đun SSL không được bật theo mặc định, do đó, tất cả mọi thứ bên trong các <IfModule mod_ssl.c>khối đều âm thầm bị bỏ qua.

Cách đây nhiều năm, tôi đã gói tất cả các vhost SSL của mình vào điều kiện này và lần này tôi vừa sao chép các tệp cấu hình qua máy chủ mới.

Tôi đã sửa nó bằng cách kích hoạt mô-đun:

sudo a2enmod ssl

0

Tôi phát hiện ra nguồn gốc của vấn đề này là một mục / etc / hosts trên máy chủ của tôi với URL trong đó trỏ đến IP bên ngoài của máy chủ.

Tại một thời điểm tôi phải thiết lập nó trước khi DNS sẵn sàng vì vậy tôi đã nhập mục / etc / hosts trên máy chủ của mình trỏ đến IP bên ngoài của chính nó:

1.2.3.4 vhost.example.com

Sau đó, tôi thiết lập ServerAlias ​​đến một trang web hiện có cho "vhost.example.com"

Nhưng không có gì tôi có thể làm sẽ ngăn Apache phục vụ trang web ssl.conf mặc định cho các yêu cầu SSL đến vhost.example.com. Cổng 80 HTTP hoạt động tốt, nhưng SSL luôn hiển thị trang mặc định thay thế. Cuối cùng, chủ đề SO này đã dẫn tôi thử "apachectl -S" để hiển thị các trang web và cuối cùng tôi đã có thể tìm ra nó.

Vì vậy, nếu bạn đang nhận được trang SSL mặc định thay vì trang bạn mong đợi, hãy đảm bảo bạn đã không thêm địa chỉ IP bên ngoài của máy chủ vào mục nhập / etc / hosts! Một điều khá kỳ lạ đã được thực hiện trong nhận thức muộn màng, nhưng hy vọng điều này sẽ giúp người khác!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.