Windows

如何在 Windows 10 的 squid 3.5 下設置 url 重寫

  • November 9, 2018

我一直在嘗試使用 store-id-program 設置在 Windows 盒子上設置 squid 3.5.27。

但是,似乎無論我如何設置它,我正在執行的 python 腳本立即得到輸入結束(可以通過添加跟踪看到),然後 squid 停止執行,抱怨

Squid Cache (Version 3.5.27): Terminated abnormally.
FATAL: The store_id helpers are crashing too rapidly, need help!

我嘗試了各種變體(顯然不是同時):

store_id_program /cygdrive/c/apps/squid/local/bin/texture_rewrite.bat
store_id_program /cygdrive/c/apps/squid/local/bin/texture_rewrite.py
store_id_program /cygdrive/c/apps/Python27/python.exe -u c:\apps\squid\local\bin\texture_rewrite.py

(.bat 文件由 組成@<path-to-python> -u <path to script>

如果我不嘗試設置 url 重寫,Squid 可以正常工作。

作為參考,python 腳本如下所示:

while True:
   line = sys.stdin.readline()
   print >>sys.stderr, line
   if not line:
       break
   line = line.strip()
   if line != '':
       process(line)

print >>sys.stderr, 'exit'

程序(行)永遠不會被呼叫

如果您從squid.diladele.com引用我們的 Squid for windows 建構- 那麼這很可能是由於 Cygwin 如何在 Cygwin 二進製文件 (squid) 和您的本機 Windows 二進製文件 (python) 之間建立管道模型。如果我沒記錯的話,管道被建模為文件上的非阻塞重疊 IO - 在讀取後立即獲得 ERROR_IO_PENDING - 在任何控制台程序中都被解釋為 EOF。

在https://www.cygwin.com/ml/cygwin/2006-03/msg00330.html、https://github.com/nodejs/node/issues/3006和許多其他人中部分討論了這個問題。

最好的辦法是從 cygwin中將 urlrewriter 編譯為 C++ 程式碼——在這種情況下,程式碼將自動使用與 squid 相同的管道實現,從而工作。或者像我們在 urlrewriter 中那樣使用從重疊文件中逐字節讀取(只是一個範例)

read_result read(char& c)
{
   // this is the value to return
   CHAR  value = 0;
   DWORD read  = 0;
   DWORD len   = sizeof(CHAR);

   // construct overlapped structure
   OVERLAPPED ovl = {};
   {
       ovl.hEvent = hevent_;
   }

   // read one byte from input
   BOOL bres = ::ReadFile(stdin_, &value, len, &read, &ovl);
   DWORD err = ::GetLastError();
   if (bres)
   {
       // see if we read 0 bytes
       if (0 == read)
       {
           // yes, read of 0 bytes from the redirected pipe in cygwin means eof???
           return reached_eof;
       }

       // debug check
       _ASSERTE('\0' != value);

       // otherwise store char
       c = value;

       // nice 
       return read_success;
   }

   // we have encountered and error, see which one
   switch (err)
   {
   case ERROR_HANDLE_EOF:
       return reached_eof;

   case ERROR_IO_PENDING:
       {
           // wait until overlapped read completes
           BOOL bres = GetOverlappedResult(stdin_, &ovl, &read, TRUE);
           if (bres)
           {
               // good, we have read one byte
               c = value;

               // nice
               return read_success;
           }

           // overlapped result failed, there might be a lot of reason for this, see if EOF is there
           if (ERROR_HANDLE_EOF == GetLastError())
               return reached_eof;

           // in case of all other errors we fail the operation
           return read_error;
       }
       break;

   default:
       // some unknown error, we also fail the operation
       return read_error;
   }
}

引用自:https://serverfault.com/questions/937515