Varnish + nginx + php-fpm. Не могу запустить ngnix на порту 8080

Главные вкладки

Аватар пользователя Litos Litos 21 апреля 2015 в 15:15

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

Схема работы должна иметь следующий вид:
1. пользователь открывает в браузере сайт, при этом отправляется запрос на 80 порт
2. первым стоит Varnish на 80 порту. Если у него есть запрос - он отдаёт его сам. Если нет - переводит запрос на 8080 порт
3. на 8080 порту стоит Nginx. Если у него есть запрос - отдаёт сам, если нет - переводит на 9000 порт
4. на 9000 порту стоит php-fpm. Он выполняет полную обработку запроса с вызовом БД и загрузкой файлов

Конфиги:

/etc/default/varnish
DAEMON_OPTS="-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,512M"

/etc/varnish/default.vcl
backend default {
.host = "127.0.0.1";
.port = "8080";
}
sub vcl_recv {
if (req.http.Cookie !~ "SESS") {
unset req.http.Cookie;
}
}
sub vcl_pass {
if (!req.http.Cookie) {
set bereq.http.Cookie = "has_js=1";
}
}
sub vcl_miss {
if (!req.http.Cookie) {
set bereq.http.Cookie = "has_js=1";
}
}

/etc/nginx/sites-available/example.ru
server {
listen 127.0.0.1:8080;
server_name example.ru www.example.ru;
index index.html index.htm index.php;
root /home/webmaster/domains/example.ru/html;
access_log /home/webmaster/domains/example.ru/logs/nginx_access.log;
error_log /home/webmaster/domains/example.ru/logs/nginx_error.log;
location / {
try_files $uri drupal;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location drupal {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_read_timeout 600;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param QUERY_STRING q=$uri&$args;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
}

/etc/php5/fpm/pool.d/www.conf
user = webmaster
group = webmaster
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 7
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 1500
request_terminate_timeout = 30
chdir = /
security.limit_extensions = .php
php_admin_value[error_log] = /home/webmaster/domains/example.ru/logs/fpm-php.error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 256M
php_admin_value[open_basedir] = "/home/webmaster:."
php_admin_value[upload_tmp_dir] = "/home/webmaster/tmp"
php_admin_value[session.save_path] = "/home/webmaster/tmp"

Апач на порту 8080 остановил.
Проверяю что и где запущено командой: sudo netstat -tulpn | grep 80

Но есть проблема.
Схему настроил, конфиги подошли и не вызвали ошибок. Остановил службы Varnish, Nginx, php-fpm. И начинаю их запускать в порядке по моей схеме.
Сперва запустил Varnish. Проверил его работу на 80 порту.
Запускаю Nginx. Ошибки:
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
nginx.

Не понравился ему Varnish на 80 порту.
Пытаюсь перенести Nginx на 8080 порт - пока не удаётся. Он упорно пытается запустится на 80.

Ищу дальше.

Комментарии

Аватар пользователя konstantin.komelin@drupal.org konstantin.kome... 21 апреля 2015 в 15:42

Не изучал ваши конфиги, сразу говорю.
Но у nginx, возможно, включен дефолтный хост, который слушает 80 порт по умолчанию. Обычно символьная ссылка называется как-нибудь так 000-default и лежит в папке sites-enabled. Нужно поменять в этом конфиге listen 80; на listen 8080;

Аватар пользователя ttenz ttenz 21 апреля 2015 в 17:00

"Litos" wrote:
Varnish + nginx

nginx-у varnish как Вам пятая нога.

ну а если, то....

sudo apt-get remove --purge apache2 apache2-utils
sudo rm -rf /etc/apache2
sudo fuser -k 80/tcp
service nginx start

+ то что выше советовали

Аватар пользователя Sky Cat Sky Cat 21 апреля 2015 в 17:12

ttenz wrote:
"<a href="mailto:konstantin.komelin@drupal.org">konstantin.komelin@drupal.org</a>" wrote:

игрушки это да, тогда просто почитайте для интереса:

https://rtcamp.com/blog/why-we-never-use-varnish-with-nginx/[/quote]
Там больше применительно к Wordpress. Да и Disclaimer нам как бы намекает, что автор не совсем в теме.

Я пробовал связку Nginx + Varnish + php-fpm и Nginx + php-fpm. В принципе, обе связки работают нормально. Сейчас у меня на сайте работает связка Nginx + php-fpm. Nginx со встроенным кэшированием. В друпале стоит самописный модуль, который при обновлении нод удаляет страницу из кэша nginx.

На drupal 8 я буду использовать связку Nginx + Varnish + php-fpm. Nginx будет заниматься роутингом, балансировкой и отдачей статики, varnish будет кэшировать динамические данные.

Аватар пользователя konstantin.komelin@drupal.org konstantin.kome... 21 апреля 2015 в 17:07

Простите, что за треш:

«Disclaimer: I never used Varnish. So please do not treat this as Varnish v/s Nginx post. It will be wrong on my part to compare Nginx to something that I have never used.»

В отличии от автора, я юзаю оба.

Аватар пользователя Sky Cat Sky Cat 21 апреля 2015 в 17:07

Вообще, довольно странный порядок серверов у вас. По идее, надо бы вначале nginx поставить. С помощью него отдавать напрямую всю статику, а varnish пусть проксирует и кэширует запросы от php-fpm.