nginx + ??? + fcgi

167 views
Skip to first unread message

Leonid Nikolaev

unread,
Apr 6, 2017, 11:44:23 AM4/6/17
to gola...@googlegroups.com
Добрый день!!

Начинаем новый проект. Решили писать на Го, до этого на нем были только роботы всякие. И тут возник вопрос с тем, как правильно все построить изначально.

Сегодня реализовал вот такую схему:
   -  есть простой однопоточный go fcgi бинаркиник
   - его запускает в несколько потоков spawn-fcgi (прочел, что так лучше всего, но объяснений этому не нашел)
    - через fastcgi_pass: unix/socket - получаем данные в nginx

Но гложут меня сомнения, что это как-то не правильно. Прежде всего из-за того, что чтобы spawn-fcgi работал штатно, надо еще всякие supervisor/monito ставить и т.д. 

Поэтому хочу услышать мнение опытных людей: как надо делать? 


--
WBR, Leonid "nikonor" Nikolaev



Ivan Anfilatov

unread,
Apr 6, 2017, 3:01:12 PM4/6/17
to gola...@googlegroups.com
Добрый день.

Не могу сказать за других, однако, лично я в своих проектах использую одну из двух схем:
* Go сам обрабатывает реквесты (net/http или fasthttp) - в  случае если на сервере один проект
* Go работает через не большой самодельный прокси-сервер (так-же написанный на Go), соответсвенно проект слушает один из портов локалхоста.

Подобные схемы применяются более года, полёт успешный.

6 апреля 2017 г., 18:43 пользователь Leonid Nikolaev <nik...@nikonor.ru> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
__________________________________

King Regards, Anfilatov Ivan

Leonid Nikolaev

unread,
Apr 7, 2017, 3:02:11 AM4/7/17
to gola...@googlegroups.com
Иван, если не сложно, можете рассказать чуть подробнее?

1) используете ли вы горутины в программе? Или все делается в один поток и несколько запущенных копий?
2) если копии, то как они запускаются? через что?
3) как отслеживаете состояние системы? в смысле, что все потоки живы. 



6 апреля 2017 г., 22:00 пользователь Ivan Anfilatov <t0pep0...@gmail.com> написал:

Алексей Акулович

unread,
Apr 7, 2017, 3:09:41 AM4/7/17
to Golang Russian, nik...@nikonor.ru
Привет.

Зачем вам fcgi? Запустите Go с его встроенным HTTP сервером, и задайте Go как upstream в конфиге nginx.


четверг, 6 апреля 2017 г., 18:44:23 UTC+3 пользователь Leonid Nikolaev написал:

Leonid Nikolaev

unread,
Apr 7, 2017, 3:29:47 AM4/7/17
to gola...@googlegroups.com
Если честно, то по привычке. Лет 20 назад с cgi перешли на fcgi, так и делаю с тех пор :-) 

Я правильно понял по вашему сообщению, что выиграть на добавлении fcgi  сложно?

7 апреля 2017 г., 10:09 пользователь Алексей Акулович <aterc...@narod.ru> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Алексей Акулович

unread,
Apr 7, 2017, 3:38:06 AM4/7/17
to Golang Russian, nik...@nikonor.ru
В Go отличный HTTP сервер. Почему бы не использовать это преимущество? 20 лет назад многих и cgi устраивал...


пятница, 7 апреля 2017 г., 10:29:47 UTC+3 пользователь Leonid Nikolaev написал:
Если честно, то по привычке. Лет 20 назад с cgi перешли на fcgi, так и делаю с тех пор :-) 

Я правильно понял по вашему сообщению, что выиграть на добавлении fcgi  сложно?
7 апреля 2017 г., 10:09 пользователь Алексей Акулович <aterc...@narod.ru> написал:
Привет.

Зачем вам fcgi? Запустите Go с его встроенным HTTP сервером, и задайте Go как upstream в конфиге nginx.


четверг, 6 апреля 2017 г., 18:44:23 UTC+3 пользователь Leonid Nikolaev написал:
Добрый день!!

Начинаем новый проект. Решили писать на Го, до этого на нем были только роботы всякие. И тут возник вопрос с тем, как правильно все построить изначально.

Сегодня реализовал вот такую схему:
   -  есть простой однопоточный go fcgi бинаркиник
   - его запускает в несколько потоков spawn-fcgi (прочел, что так лучше всего, но объяснений этому не нашел)
    - через fastcgi_pass: unix/socket - получаем данные в nginx

Но гложут меня сомнения, что это как-то не правильно. Прежде всего из-за того, что чтобы spawn-fcgi работал штатно, надо еще всякие supervisor/monito ставить и т.д. 

Поэтому хочу услышать мнение опытных людей: как надо делать? 


--
WBR, Leonid "nikonor" Nikolaev



--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Ivan Anfilatov

unread,
Apr 7, 2017, 5:41:43 AM4/7/17
to gola...@googlegroups.com
1) net/http и fasthttp на каждый реквест запускают отдельную go-рутину главное не забыть выставить GOMAXPROC
2) -
3) Собственная система мониторинга, мониторить каждую go-рутину считаю бесполезной тратой ресурсов

7 апреля 2017 г., 10:38 пользователь Алексей Акулович <aterc...@narod.ru> написал:
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+unsubscribe@googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--

Алексей Акулович

unread,
Apr 7, 2017, 5:43:33 AM4/7/17
to Golang Russian
В современных версиях Go уже ж не надо задавать (обычно) GOMAXPROC явно - оно само выставляется по числу ядер.


пятница, 7 апреля 2017 г., 12:41:43 UTC+3 пользователь Ivan Anfilatov написал:

Alexey “AlekSi” Palazhchenko

unread,
Apr 7, 2017, 5:45:19 AM4/7/17
to gola...@googlegroups.com
Привет,

> 1) net/http и fasthttp на каждый реквест запускают отдельную go-рутину главное не забыть выставить GOMAXPROC

GOMAXPROCS с 1.5 равен числу ядер, а не 1, так что можно уже и не ставить.

+1 к отказу от FastCGI в пользу net/http с nginx (для связи с upstream надо использовать HTTP/1.1 и 'proxy_set_header Connection "";’) или без nginx.

–-–
Алексей «AlekSi» Палажченко

Leonid Nikolaev

unread,
Apr 7, 2017, 8:14:52 AM4/7/17
to gola...@googlegroups.com
Спасибо!! Пошел читать про эти чудеса :-)

7 апреля 2017 г., 12:45 пользователь Alexey “AlekSi” Palazhchenko <alexey.pa...@gmail.com> написал:
--
Вы получили это сообщение, поскольку подписаны на группу Golang Russian.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+unsubscribe@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/d/optout.

Sergey Kandyla

unread,
Apr 10, 2017, 12:14:21 PM4/10/17
to gola...@googlegroups.com

Здравствуйте!

а зачем вообще такая схема? fcgi? как-то это все отголоски эры php, в Golang многопоточность решается через goroutines.

Касательно nginx перед go, я делал бенчмарки (https) приложения c fasthttp. И без нжинкса получается больший перформанс (tps). До 2х раз. Это через wrk в несколько сотен коннектов. Однако, нжинкс позволяет из коробки более прозрачно тюнинговать https, плюс выше стабильность. У меня это проявилось при лоад тестах  vegeta, -  через нжинкс отрабатывает, а напрямую на fasthttp (with https)  нет (настройки fasthttp дефолтные). Полагаю, связано с тем, что вегета сразу пытается создать много коннекшинов, чтобы обеспечить заданный tps.
Ну а без https вообще скорость запредельная.

Да, еще не забывайте что unix\socket это не scalable.
--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".

deamon...@gmail.com

unread,
Apr 10, 2017, 12:14:57 PM4/10/17
to Golang Russian, nik...@nikonor.ru
Все привет!
Вот хочу начать изучать golang для создания сайтов. Но имеются вопросы много вопросов на данный момент сайты создаю на php и все вопросы у меня отталкиваются от знания php


1. Как обстоят дела с производительностью в сравнении с php смотрел benchmark go выигрывает у php в 2 раза по скорости
(возможно мне стоит и дальше сайты создавать на php)
2. Влияет ли как-то golang на seo оптимизацию-выдачу
(если для frontend не админ панели взять angularjs то сайт не будет весь индексироваться)
3. Какую выбрать связку для сервера возможно имеется nginx или apache в поддержке для golang (или у go имеется свой сервер и как он в сравнении с остальными)
4. Поддерживает ли golang mysql и какая скорость
5. Возможно имеются хорошие фреймворки написанные на golang для создания именно сайтов
6. Подойдет ли вообще golang для мелких или для крупных сайтов
7. Имеются ли подводные камни при разработке


Возможно просто кто-то уже делал сайты на golang просто поделитесь опытом пожалуйста именно для разработки сайтов буду очень признателен, и простите за глупые вопросы =(

Leonid Nikolaev

unread,
Apr 12, 2017, 12:06:53 PM4/12/17
to gola...@googlegroups.com
​Сергей, вот тут писали, что горутины в таких приложения не нужны, потому как net/http сам запускает рутину на каждый запрос. ​Я проверял, похоже так.

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

7 апреля 2017 г., 8:48 пользователь Sergey Kandyla <skan...@gmail.com> написал:
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Stanislav N. aka pztrn

unread,
Apr 12, 2017, 12:16:06 PM4/12/17
to gola...@googlegroups.com
Только в том случае, если вам необходимо обрабатывать результаты запроса асинхронно.

-- 
With best regards, 
Stanislav N. aka pztrn
Jabber: pz...@pztrn.name
E-Mail: pz...@pztrn.name
Blog: http://pztrn.name && http://en.pztrn.name
Telegram: @pztrn
Key ID: B3E1F07E

12.04.2017 21:06, Leonid Nikolaev пишет:
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
signature.asc

Kirill Ratkin

unread,
Jun 15, 2017, 4:04:38 AM6/15/17
to Golang Russian, nik...@nikonor.ru
Да, запускает.
Это не сложно увидеть в коде https://golang.org/src/net/http/server.go
В строках начина я 2966 видим:
	go func() {
  		h.handler.ServeHTTP(tw, r)
  		close(done)
  	}()

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



среда, 12 апреля 2017 г., 19:06:53 UTC+3 пользователь Leonid Nikolaev написал:
​Сергей, вот тут писали, что горутины в таких приложения не нужны, потому как net/http сам запускает рутину на каждый запрос. ​Я проверял, похоже так.

По вашему мнению стоит оформлять свои горутины? Буду очень благодарен на ответ и, может быть, пример, как делать правильно.
7 апреля 2017 г., 8:48 пользователь Sergey Kandyla <skan...@gmail.com> написал:

Здравствуйте!

а зачем вообще такая схема? fcgi? как-то это все отголоски эры php, в Golang многопоточность решается через goroutines.

Касательно nginx перед go, я делал бенчмарки (https) приложения c fasthttp. И без нжинкса получается больший перформанс (tps). До 2х раз. Это через wrk в несколько сотен коннектов. Однако, нжинкс позволяет из коробки более прозрачно тюнинговать https, плюс выше стабильность. У меня это проявилось при лоад тестах  vegeta, -  через нжинкс отрабатывает, а напрямую на fasthttp (with https)  нет (настройки fasthttp дефолтные). Полагаю, связано с тем, что вегета сразу пытается создать много коннекшинов, чтобы обеспечить заданный tps.
Ну а без https вообще скорость запредельная.

Да, еще не забывайте что unix\socket это не scalable.
   

On 06/04/2017 18:43, Leonid Nikolaev wrote:
Добрый день!!

Начинаем новый проект. Решили писать на Го, до этого на нем были только роботы всякие. И тут возник вопрос с тем, как правильно все построить изначально.

Сегодня реализовал вот такую схему:
   -  есть простой однопоточный go fcgi бинаркиник
   - его запускает в несколько потоков spawn-fcgi (прочел, что так лучше всего, но объяснений этому не нашел)
    - через fastcgi_pass: unix/socket - получаем данные в nginx

Но гложут меня сомнения, что это как-то не правильно. Прежде всего из-за того, что чтобы spawn-fcgi работал штатно, надо еще всякие supervisor/monito ставить и т.д. 

Поэтому хочу услышать мнение опытных людей: как надо делать? 


--
WBR, Leonid "nikonor" Nikolaev



--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Ivan Anfilatov

unread,
Jun 15, 2017, 5:43:17 AM6/15/17
to gola...@googlegroups.com
> 2. Влияет ли как-то golang на seo оптимизацию-выдачу
(если для frontend не админ панели взять angularjs то сайт не будет весь индексироваться)

Нет, это зависит только от front-end


> 3. Какую выбрать связку для сервера возможно имеется nginx или apache в поддержке для golang (или у go имеется свой сервер и как он в сравнении с остальными)
Ответ был ниже, а так либо nginx, либо  go напрямую
> 4. Поддерживает ли golang mysql и какая скорость
Поддерживает, вторую часть вопроса не совсем понял

> 5. Возможно имеются хорошие фреймворки написанные на golang для создания именно сайтов
Есть, много, от gin до gramework

> 6. Подойдет ли вообще golang для мелких или для крупных сайтов
Точно так-же как и любой другой язык общего назначения

> 7. Имеются ли подводные камни при разработке
Все "подводные камни" описаны в спеке языка

7 апреля 2017 г., 20:46 пользователь <deamon...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Некто Вадим

unread,
Aug 27, 2017, 1:08:56 PM8/27/17
to Golang Russian, nik...@nikonor.ru
Не стоит использовать fcgi в gо, он там сильно тормозной: https://gist.github.com/hgfischer/7965620
http можно пустить так же по unixsocket.




четверг, 6 апреля 2017 г., 18:44:23 UTC+3 пользователь Leonid Nikolaev написал:
Reply all
Reply to author
Forward
0 new messages