2013-12-02 4 views
0

Для использования Nginx с Go решение, которое я вижу обычно, использует fastcgi_pass от Nginx и Go «net/http/fcgi».Go (golang) прямой вывод в Nginx

Однако мне интересно, является ли использование http-сервиса Go здесь избыточным. Поскольку Nginx выводит ответ как HTTP-ответ, можно просто передать строки возврату из сценария Go в Nginx и позволить Nginx создать ответ HTTP?

Следует принимать во внимание любые дальнейшие объяснения относительно базового рабочего процесса и последствий для производительности.

+0

Вы не можете передавать «строки» в nginx. Он говорит HTTP (и FastCGI). Преимущество использования nginx в качестве внешнего прокси-сервера заключается в том, что он обеспечивает надежную поддержку SSL, множество модулей, значительную настройку и быструю статическую работу с файлами. Вы также можете обслуживать страницу обслуживания, если ваше приложение Go не работает. – elithrar

+0

@elithrar И увлекательно, Go имеет эти возможности встроенный, тоже. (Но это, скорее всего, более шаблонный.) Одна из причин, по которой я использовал nginx в сочетании с Go, - это заставить nginx выполнять обслуживание, а Go выполняет обработку/логику. Но я не всегда это делаю ... – Matt

+1

@Matt Конечно. Хорошим примером является SSL: Go может это сделать, но вы можете сделать намного больше (то есть общий кешированный) более легко с nginx. Я думаю, что мой ответ по этому вопросу подводит итог: http://stackoverflow.com/a/17777630/556573 – elithrar

ответ

1

Я никогда не использовал fastcgi для фактического развертывания, хотя однажды я помог с функциональным примером. Что касается производительности, я бы поставил перед собой задачу установки fcgi с настройкой обратного прокси-сервера и сравнением.

1

Вы прочитали: the FactCGI spec? Это явно определяет, как FastCGI сервер и клиенты pefrorm their exchange:

3.3 Записи

Приложения выполняют запросы от веб-сервера, используя простой протокол. Информация о протоколе зависит от роли приложения, но, грубо говоря, веб-сервер сначала отправляет в приложение параметры и другие данные, тогда приложение отправляет данные результата на веб-сервер, и, наконец, приложение отправляет веб-серверу указание, что запрос завершено.

Все данные, передающиеся по транспортному соединению, хранятся в записях FastCGI. Записи FastCGI выполняют две вещи. Во-первых, записывает мультиплексирование транспортного соединения между несколькими независимыми запросами FastCGI. Это мультиплексирование поддерживает приложения, которые могут обрабатывать параллельные запросы, используя методы программирования с использованием событий или многопоточности. Во-вторых, записи предоставляют несколько независимых потоков данных в каждом направлении в рамках одного запроса. Таким образом, например, как данные stdout, так и stderr могут передаваться через одно транспортное соединение из приложения на веб-сервер, вместо того, чтобы требовать отдельных соединений.

typedef struct { 
     unsigned char version; 
     unsigned char type; 
     unsigned char requestIdB1; 
     unsigned char requestIdB0; 
     unsigned char contentLengthB1; 
     unsigned char contentLengthB0; 
     unsigned char paddingLength; 
     unsigned char reserved; 
     unsigned char contentData[contentLength]; 
     unsigned char paddingData[paddingLength]; 
    } FCGI_Record; 

FastCGI запись состоит из фиксированной длины префикса, за которым следует переменное количество содержимого и заполнения байтов.

& hellip;

Как вы можете видеть, это двоичный протокол, отличный от HTTP.

Смежные вопросы