Здравствуйте.
Схема работы должна иметь следующий вид:
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.
Ищу дальше.
Комментарии
Не изучал ваши конфиги, сразу говорю.
Но у nginx, возможно, включен дефолтный хост, который слушает 80 порт по умолчанию. Обычно символьная ссылка называется как-нибудь так 000-default и лежит в папке sites-enabled. Нужно поменять в этом конфиге listen 80; на listen 8080;
И да, Апачи надо убрать из автозагрузки или удалить совсем.
nginx-у varnish как Вам пятая нога.
ну а если, то....
sudo rm -rf /etc/apache2
sudo fuser -k 80/tcp
service nginx start
+ то что выше советовали
Varnish в качестве прокси-кеша покруче будет чем Nginx, на мой взгляд. Но спорить с вами не буду, у каждого свои игрушки )
игрушки это да, тогда просто почитайте для интереса:
https://rtcamp.com/blog/why-we-never-use-varnish-with-nginx/
Простите, что за треш:
«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.»
В отличии от автора, я юзаю оба.
Вообще, довольно странный порядок серверов у вас. По идее, надо бы вначале nginx поставить. С помощью него отдавать напрямую всю статику, а varnish пусть проксирует и кэширует запросы от php-fpm.
Спасибо, konstantinkomelin-drupalorg! Разобрался.