Tạm thời chuyển hướng * tất cả * các yêu cầu HTTP / HTTPS trong IIS sang trang bảo trì máy chủ của mạng


10

Chúng tôi đã có một máy chủ IIS lưu trữ hàng trăm ứng dụng web riêng biệt và máy chủ cơ sở dữ liệu vật lý lưu trữ các ứng dụng này sẽ được đưa ra ngoại tuyến để bảo trì trong một thời gian ngắn (chúng tôi hy vọng sẽ mất ít hơn 15 phút).

Trong khoảng thời gian đó, chúng tôi muốn chuyển hướng TẤT CẢ lưu lượng truy cập, đối với bất kỳ trang web nào, đến trang "chúng tôi hiện đang bảo trì".

Tôi nhận ra rằng tôi có thể làm điều này bằng cách truy cập mọi ứng dụng web và thiết lập quy tắc viết lại IIS để gửi người dùng đến một trang khác cho tất cả các yêu cầu trong ứng dụng đó. Nhưng, chúng tôi sẽ mất nhiều thời gian hơn để làm điều đó hơn là bảo trì cơ sở dữ liệu!

Tôi đã thử ba thứ, không cái nào trong số đó có tác dụng:

Quy tắc viết lại IIS toàn cầu

Tôi đã tìm kiếm một cách đơn giản để áp dụng quy tắc cho tất cả các trang web, trong một cú trượt - và sau đó có thể "hoàn tác" quy tắc đó trong một bước không đau đớn như nhau. Cho đến nay, không có nỗ lực của tôi đã làm việc. Tôi đã thử đặt quy tắc viết lại này trong web.config toàn cầu của mình tại W: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config:

<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="redirect all requests" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
                    </conditions>
                    <action type="Redirect" url="http://www.somedomain.com/maintenance" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

Điều này đã không làm việc. Chúng tôi đang chạy .NET 4.0 64 bit trong IIS, nhưng "chỉ trong trường hợp" tôi đặt điều tương tự với các tệp web.config toàn cầu 32 bit và 2.0, và vẫn không thay đổi.

App_ Offerline.htm "tập tin đặc biệt"

Một đề xuất khác mà tôi đã thấy là tệp "đặc biệt" app_offline.htm , nhưng chúng tôi lại gặp vấn đề tương tự về việc mất nhiều thời gian hơn để triển khai tệp này vào thư mục gốc của tất cả các ứng dụng của chúng tôi so với việc bảo trì.

Trang web "Chúng tôi ngoại tuyến" trong IIS

Tất cả các trang web của chúng tôi được thiết lập trong IIS với một IP duy nhất. Điều này hoạt động với chúng tôi ngay cả khi không có SNA vì tất cả các ứng dụng của chúng tôi đều có chung một chứng chỉ SSL (đó là UCC). Một điều xảy ra với tôi là có lẽ tôi có thể thiết lập một trang web trong IIS khớp với tất cả lưu lượng truy cập đến IP mà chúng tôi đang sử dụng và không chỉ định giá trị tiêu đề máy chủ. Hy vọng là tôi có thể cung cấp cho nó "quyền ưu tiên" cao hơn và khi được bắt đầu, nó sẽ khớp tất cả lưu lượng truy cập với IP đó, trước khi bất kỳ trang web nào khác có cơ hội phù hợp. Tôi có thể thiết lập trang web đó để phục vụ cùng một trang cho tất cả các yêu cầu, bất kể URL yêu cầu.

Bắt đầu trang web đó khi đang bảo trì và dừng lại khi hoàn thành.

Nhưng, tôi cũng không thể làm việc này được, vì IIS dường như khớp một yêu cầu HTTP với một trang web cụ thể hơn trước khi ít cụ thể hơn. Vì vậy, bằng cách bỏ qua giá trị tiêu đề máy chủ cho trang web "nói với người dùng chúng tôi ngoại tuyến", nó sẽ không được khớp trừ khi yêu cầu không có giá trị tiêu đề máy chủ phù hợp với trang web khác. Điều này đặt chúng ta trở lại cùng một vấn đề là phải truy cập thủ công từng ứng dụng web và thực hiện một hành động để đưa nó ngoại tuyến và sau đó đưa nó trở lại trực tuyến khi chúng tôi hoàn tất bảo trì

Có một cách đơn giản để thực hiện điều này? Dường như chắc chắn chúng ta không phải là người đầu tiên gặp phải vấn đề này.

-Josh


Một tùy chọn sẽ là cài đặt một phiên bản của apache hoặc một máy chủ web khác và thiết lập trang web xin lỗi của bạn trong đó. Sau đó, khi thời gian đến, dừng IIS và bắt đầu apache và yêu cầu nó xử lý tất cả các yêu cầu.
phoebus

Cách chúng ta thường làm btw này là có một trang xin lỗi trên thiết bị trước máy chủ, ví dụ như bộ cân bằng tải.
phoebus

Câu trả lời:


6

Tôi sẽ đi theo cách tiếp cận thứ ba của bạn "We're offline" Site in IIS, giả sử bạn đặt tên cho nó Offline, nếu nó không có tiêu đề máy chủ được chỉ định, nó sẽ phục vụ tất cả các yêu cầu không được chọn bởi bất kỳ trang web nào khác có tiêu đề máy chủ phù hợp. Để ngăn chặn điều này, bạn chỉ cần dừng tất cả các trang web khác.

Giả sử bạn đã cài đặt IIS Scripting, hãy mở PowerShell nâng cao:

import-module webadministration

bây giờ bạn có thể dừng tất cả các trang web ngoại trừ trang ngoại tuyến:

Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Stop-WebSite

khi SQL-Server được sao lưu, hãy khởi động lại chúng:

Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Start-WebSite

Nếu bạn cũng có các trang FTP, các lệnh sẽ hiển thị lỗi vì bạn không thể chuyển một trang FTP sang lệnh ghép ngắn Stop-WebSite, nhưng nó vẫn hoạt động cho tất cả các trang web.

Nếu bạn có các trang web thường không chạy, bạn phải loại trừ chúng trong lệnh thứ hai, như:

Where {$_.Name -ne "Offline" -and $_.Name -ne "foobar.com"}

Nếu bạn chưa cài đặt các lệnh ghép ngắn PowerShell cho IIS, bạn có thể sử dụng appcmd.exe để làm điều tương tự, mặc dù tôi đã không sử dụng nó trong nhiều năm.


2

Tất cả các trang web của chúng tôi được thiết lập trong IIS với một IP duy nhất.

1) lấy một máy tính để bàn cũ, chạy distro linux trực tiếp, cung cấp cho nó cùng một ip với hộp IIS, không kết nối nó với mạng

2) kích hoạt nginx trên hộp linux trực tiếp và tạo trang ngừng hoạt động như bạn muốn, kiểm tra nó bằng cách sử dụng một công tắc / trung tâm ngoại tuyến được kết nối với máy tính xách tay của bạn

3) rút cáp ethernet hộp IIS và cắm nó vào hộp linux trực tiếp.

4) xóa bộ nhớ cache addr mac trên công tắc (hoặc cuộn nguồn). trang web thời gian chết của bạn hiện đang sống.


0

Cài đặt Apache và tạo máy chủ ảo như sau path\to\apache\conf\extra\httpd-vhosts.conf:

<VirtualHost *:80>
    DocumentRoot C:/Apache/htdocs
    ServerName anyname.net

    # Other directives here
</VirtualHost>

Sau đó, trong tài liệu gốc được chỉ định trong cài đặt ở trên, hãy tạo tệp index.html với thông báo ngoại tuyến.

Bước sau đây rất quan trọng, bạn phải dừng tất cả các dịch vụ có thể sử dụng cổng 80 trước khi chạy Apache. Bạn có thể tìm thấy một danh sách của phần lớn trong số họ tại liên kết này


0

Tôi biết điều này đã cũ, nhưng tôi chỉ phải làm điều này trên một hộp Windows 2008 r2 cũ. Đây là một câu trả lời nhiều hơn cho tiêu đề câu hỏi; liên quan đến chi tiết câu hỏi, sau đó chỉ đơn giản là một cách tiếp cận để thiết lập " Trang web ngoại tuyến trong IIS".

Điều này không phụ thuộc vào bất cứ điều gì nhiều hơn IIS và HTML tĩnh. Chức năng "Chuyển hướng HTTP" của IIS không xử lý những gì bạn muốn, nhưng có một cách khác để mô phỏng nó. Chỉ cần thay đổi tất cả "Trang lỗi" cho trang để trỏ đến trang bảo trì. Có, điều này chỉ hoạt động nếu bạn có thể sử dụng toàn bộ "trang web" trong IIS.

Trong trường hợp của tôi, trang web có một tệp "default.htm" trong thư mục gốc của nó (ví dụ: c: \ InetPub \ wwwroot). Vì vậy, tất cả "Trang lỗi" được định cấu hình để "Thực thi URL tại trang web này" và sử dụng đường dẫn "/default.htmlm". Vì tôi sử dụng URL tuyệt đối (nghĩa là bắt đầu bằng "/") trong tệp, nên nội dung của nó thực thi chính xác trong trình duyệt, bất kể URL công khai có vẻ như thế nào.

Kết quả cuối cùng của cấu hình này là bất kỳ / tất cả các yêu cầu đối với trang web phục vụ nội dung của trang bảo trì của tôi. Nó không quan trọng yêu cầu là gì.

Ngoài ra, hãy lưu ý rằng IIS sẽ ảnh hưởng đến thay đổi này bằng cách tạo tệp web.config trong thư mục gốc. Đây là những gì nó tạo ra cho tôi:

 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <system.webServer>
         <httpErrors>
             <remove statusCode="502" subStatusCode="-1" />
             <remove statusCode="501" subStatusCode="-1" />
             <remove statusCode="500" subStatusCode="-1" />
             <remove statusCode="412" subStatusCode="-1" />
             <remove statusCode="406" subStatusCode="-1" />
             <remove statusCode="405" subStatusCode="-1" />
             <remove statusCode="404" subStatusCode="-1" />
             <remove statusCode="403" subStatusCode="-1" />
             <remove statusCode="401" subStatusCode="-1" />
             <error statusCode="401" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="403" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="404" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="405" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="406" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="412" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="500" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="501" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="502" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
         </httpErrors>
     </system.webServer>
 </configuration>
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.