Windows
如何在 Windows 10 的 squid 3.5 下設置 url 重寫
我一直在嘗試使用 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; } }