Я экспериментирую с использованием fastcgi на nginx, но у меня возникли некоторые проблемы. Nginx не повторно использует соединения, он дает 0 в битах BeginRequest, поэтому приложение должно закрыть соединение после завершения запроса.
У меня есть следующий код для закрытия:
socket.shutdown(SocketShutdown.BOTH);
socket.close();
Проблема в том, что соединения фактически не закрыты. Они задерживаются как TIME_WAIT, а nginx (или что-то) не будет открывать новые соединения. Я предполагаю, что я делаю что-то не так, когда закрываю сокеты, но я не знаю, что.. На связанную ноту - как я могу заставить nginx поддерживать открытые соединения?
Это использует nginx 1.0.6 и D 2.055
EDIT: Не подошли ближе, но я также проверил опцию linger, и она выключена:
linger l;
socket.getOption(SocketOptionLevel.SOCKET, SocketOption.LINGER, l);
assert(l.on == 0); // off
getOption
возвращает 4, хотя.. Не знаю, что это значит. Возвращаемое значение недокументировано.
EDIT: Я также попытался использовать TCP_NODELAY для последнего отправленного сообщения, но это тоже не имело никакого эффекта:
socket.setOption(SocketOptionLevel.SOCKET, SocketOption.TCP_NODELAY, 1);
EDIT: Поддержка nginx 1.1.4 поддерживает живые соединения. Это не работает должным образом. Правильно сообщите, что сервер отвечает за управление жизненным циклом соединения, но он по-прежнему создает новый сокет для каждого запроса.