Máy chủ ảo Apache dựa trên * nguồn * IP


9

Có thể định cấu hình Apache cho các máy chủ ảo khác nhau dựa trên IP nguồn không? (tức là cùng một giao diện, cùng tên máy chủ, nhưng hai máy chủ ảo khác nhau, có nội dung khác nhau, dựa trên IP nguồn .)

Động lực cho việc này là để địa chỉ IP của tôi có thể truy cập trang web phù hợp, nhưng mọi người khác đều có trang giữ. Giải pháp thông thường dường như là sử dụng mod_rewrite để hướng khách truy cập đến một trang riêng trong cùng một docroot, nhưng tôi muốn sử dụng một docroot hoàn toàn khác cho trang đang giữ.


BTW, tại sao bạn cần logic này cho chính mình trên máy chủ? Bạn có thể ánh xạ tên miền tới IP của máy chủ thử nghiệm (hoặc máy tính của riêng bạn) cho chính bạn bằng cách sử dụng tệp máy chủ của bạn.
Dan Grossman

Bạn có một vài tên để xử lý hoặc chỉ một? như bạn có thể làm việc (xác định Virtualhost) với tên Hoặc bằng IP.
regilero

bất kỳ lý do cụ thể tại sao một gốc doc khác nhau?
anthonysomerset

Cơ sở lý luận đã nêu của OP không có ý nghĩa (một trang đang hoạt động tốt với việc viết lại), nhưng nếu bạn đang nói, làm lại một trang web, cần một cách để lưu trữ lại và không biết rằng tên miền phụ tồn tại, bạn có thể quyết định làm theo cách này
womble

Bạn có thể sử dụng các dòng Cho phép / Từ chối để chặn quyền truy cập đối với mọi người trừ bạn và có tài liệu lỗi tùy chỉnh cho 403 lỗi (Đảm bảo bạn đặt nó trong một thư mục và cho phép truy cập vào thư mục đó, nếu không thì tài liệu lỗi cũng sẽ 403), hoặc sử dụng các quy tắc viết lại / điều kiện viết lại hoặc di chuyển trang web thử nghiệm trước khi ra mắt của bạn sang một tên miền phụ như dev.example.com sau đó example.com có ​​thể có trang giữ
Smudge

Câu trả lời:


5

Tôi không biết nếu điều đó có thể (dù sao không có mod_rewrite) ở cấp độ Apache.

Đây là một ý tưởng khác. Điều gì xảy ra nếu bạn thiết lập hai máy chủ ảo Apache và sau đó sử dụng iptables để chuyển tiếp khách truy cập trong suốt để sửa máy chủ ảo? Cái gì đó như

iptables -A PREROUTING -t nat -i eth0 -p tcp -s your.ip.address -d your.server --dport 80 -j DNAT --to-destination your.actual.site:someport
iptables -A PREROUTING -t nat -i eth0 -p tcp ! -s your.ip.address -d your.server --dport 80 -j DNAT --to-destination your.holding.site:someport

Hoặc một cái gì đó tương tự. :)


Tôi muốn nói rằng đây sẽ là lựa chọn tồi tệ nhất.
womble

8

Nó sẽ không thực sự là một máy chủ ảo khác. Nhưng bằng cách sử dụng một cái gì đó như mod_rewrite hoặc mod_alias, bạn có thể phân phát nội dung ra khỏi bất kỳ thư mục nào mà bạn đã đặt quyền phù hợp. Chỉ có một docroot, nhưng bạn có thể thay đổi điều đó một cách hiệu quả.

Một cách để làm điều đó có thể là:

<VirtualHost *.80>
    ServerName example.com
    ...
    DocumentRoot "/path/to/root"
    <Directory "/path/to/root">
       ...
    </Directory>
    <Directory "/path/to/not/root">
       Order allow,deny
       #replace with your IP
       Allow from 192.168.0.100 
       ...
    </Directory>
    RewriteEngine On
    #Rewrite to alternate path if IP address matches
    RewriteCond %{REMOTE_ADDR} ^192\.168\.0\.100$
    RewriteRule ^/(.*)$ /path/to/not/root/$1
<VirtualHost>

Mặc dù vậy, hãy lưu ý rằng có lẽ sẽ sạch hơn một chút để xử lý việc này với tên miền phụ dev.


4

Apache 2.3 trở lên

Với Apache 2.3 trở lên, rõ ràng bạn có thể làm một cái gì đó như thế này (đã thử nghiệm):

<VirtualHost *:80>
    ServerName www.example.com

    <If "-R '10.10.10.10'">
        # The next version of the website...
        Alias /favicon.ico /home/ubuntu/website-new/favicon.ico
        Alias /static/ /home/ubuntu/static/
        WSGIScriptAlias / /home/ubuntu/website-new/main/wsgi.py
    </If>
    <Else>
        # The standard version (e.g. holding page).
        Alias /favicon.ico /home/ubuntu/website/favicon.ico
        Alias /static/ /home/ubuntu/static/
        WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py
    </Else>

    # and so on...

</VirtualHost>

Apache 2.2 trở về trước

Cập nhật: Đây không phải là một giải pháp tốt. Xem bên dưới.

Bạn phải làm một hack như thế này. Lưu ý rằng [PT]viết tắt của "passthrough". Không có nó, một chuyển hướng HTTP thực tế được gửi lại cho máy khách, đây có thể không phải là điều bạn muốn. Các [OR]điều (viết tắt của "hay") cho thấy làm thế nào để phù hợp với nhiều địa chỉ.

Alias /next/favicon.ico /home/ubuntu/website-new/favicon.ico
Alias /next/static/ /home/ubuntu/static/
WSGIScriptAlias /next /home/ubuntu/website-new/main/wsgi.py

Alias /favicon.ico /home/ubuntu/website/favicon.ico
Alias /static/ /home/ubuntu/static/
WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py

# Rewrite for our IP.
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^80\.4\.170\.209$ [OR]
RewriteCond %{REMOTE_ADDR} ^94\.193\.52\.157$
RewriteRule ^/(.*) /next/$1 [PT]

Bạn cần kích hoạt mod_rewritenhững gì bạn có thể làm trên Debian / Ubuntu bằng lệnh này:

sudo a2enmod rewrite

Lưu ý rằng phương pháp này không hoàn toàn cấm người khác truy cập trang web thử nghiệm của bạn, vì vậy bạn có thể sẽ muốn thêm một số bảo mật hoặc chỉ chọn một tiền tố khó hiểu hơn next.

Cập nhật phương thức mod_rewrite.

Có một vài vấn đề với phương pháp này. Đầu tiên, Django không hoạt động với hai trang web trong cùng một quy trình như thế này, bạn cần làm theo hướng dẫn trong câu trả lời này .

Thứ hai mod_rewrite không hoạt động với POSTcác yêu cầu ! Tất cả POSTđều âm thầm thay đổi GETvà dữ liệu bài đăng bị loại bỏ. Rất bực bội! Vì vậy, tôi khuyên bạn nên sử dụng ...

phiên bản iptables

Đơn giản chỉ cần chạy các máy chủ trên hai cổng khác nhau. Điều này bao gồm các công cụ WSGI để có hai trang web django riêng biệt.

<VirtualHost *:80>
    ServerName www.example.com

    Alias /favicon.ico /home/ubuntu/alpha/favicon.ico
    Alias /static/ /home/ubuntu/alpha/static/

    WSGIDaemonProcess alpha_wsgi user=www-data group=www-data
    WSGIScriptAlias / /home/ubuntu/alpha/alpha/wsgi.py
    WSGIProcessGroup alpha_wsgi

    ServerAdmin info@example.com

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:1222>
    ServerName www.example.com

    Alias /favicon.ico /home/ubuntu/main/favicon.ico
    Alias /static/ /home/ubuntu/main/static/

    WSGIDaemonProcess main_wsgi user=www-data group=www-data
    WSGIScriptAlias / /home/ubuntu/main/main/wsgi.py
    WSGIProcessGroup main_wsgi

    ServerAdmin info@example.com

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Sau đó, bạn có thể sử dụng iptableslệnh này để định tuyến các yêu cầu từ địa chỉ IP của bạn trên cổng 80 đến cổng 1222:

sudo iptables -A PREROUTING -t nat -p tcp -s your.ip.address --dport 80 -j DNAT --to-destination :1222

Thay đổi -Ađể -Dloại bỏ quy tắc.

Lưu ý rằng các tài liệu đề nghị bạn cần thêm các lệnh Listenvà bổ sung NameVirtualHost, nhưng tôi thực sự thấy rằng nó hoạt động mà không có chúng, và việc thêm chúng làm cho nó bị hỏng (ít nhất là trong ubfox).


Câu trả lời của bạn cho 2.3+ cung cấp Alias cannot occur within <Directory/Location/Files> sectionbất kỳ sửa chữa? Tôi thực sự cần cái này: $
Gizmo

2

AFAIK, cách duy nhất để làm điều này là liên kết một vị trí trong gốc tài liệu với nội dung của bạn bên ngoài gốc tài liệu, sau đó viết lại yêu cầu đến đó.


1

Giống như @Timmmm đã nói, nhưng sửa câu lệnh ipmatch (lưu ý '10 .10.10.10 '): ServerName www.example.com

<If "%{REMOTE_ADDR} -ipmatch '10.10.10.10'">
    # The next version of the website...
    Alias /favicon.ico /home/ubuntu/website-new/favicon.ico
    Alias /static/ /home/ubuntu/static/
    WSGIScriptAlias / /home/ubuntu/website-new/main/wsgi.py
</If>
<Else>
    # The standard version (e.g. holding page).
    Alias /favicon.ico /home/ubuntu/website/favicon.ico
    Alias /static/ /home/ubuntu/static/
    WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py
</Else>

# and so on...

Bởi vì nếu không nó sẽ hiển thị lỗi:

Cannot parse condition clause: -ipmatch requires subnet/netmask as constant argument
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.