Пара строк в nginx...

LM
На сайте с 18.10.2009
Offline
117
1739

Программисты поставили задачку...

На сервере есть пользователь system, в папке /var/www/system/data/www/system.com лежит движок, который генерирует при помощи php и mysql страницы и сохраняет их в качестве кеша в папке /var/www/cache/data/www/имя_домена/, которая принадлежит юзеру cache.

Имя_домена - это любой сайт, работающий на движке. Короче, система мультисайтовая.

По идее, если любая страница уже существует, то движок её из папки юзера cache выдать посетителю. Выдать её должен nginx (0.6.32) без участия apache.

То есть открываем имя_домена/page.html, nginx проверяет, если она есть в папке /var/www/cache/data/www/имя_домена/, то он выдаёт её. Если такой страницы нет, то запрос должен перенаправляться к apache, чтобы сгенерировать страницу.

Для этого есть такой конфиг в nginx:

server {

listen 127.0.0.1:80;
server_name system.com www.system.com;
rewrite ^(/manager/.*)$ https://$host$1 permanent;
error_page 404 = @fallback;
location ~* ^/(webstat/|awstats|webmail/|myadmin/|manimg/) {
proxy_pass http://127.0.0.1:8080;
proxy_redirect http://system.com:8080/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
#конфиг кеша
set $host_without_www $host;
if ($host ~* www\.(.*)) {
set $host_without_www $1;
}
location ~ ^/$ {
rewrite .* /index.html;
}
location / {
root /var/www/cache/data/www/$host_without_www;
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8080;
}
}
#конец конфига кеша
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect http://system.com:8080/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
root /var/www/system/data/www/system.com;
access_log /var/www/httpd-logs/system.com.access.log;
}
location @fallback {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}

В общем, эта конструкция совершенно не хочет работать: не ищет кешированные файлы в папке /var/www/cache/data/www/имя_домена

Пробовал добавить вместо

location / {

root /var/www/cache/data/www/$host_without_www;
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8080;
}
}

это

location .* ^/ {

root /var/www/cache/data/www/$host_without_www;
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8080;
}
}

Но происходит всё наоборот: страницы из /var/www/cache/data/www/$host_without_www выдаются, а вот если файла нет, сервер выдаёт ошибку 404.

Пробовал и так, и сяк. Но не получилось заставить работать как надо. Может кто знает, как правильно сконфигурировать? :rolleyes:

з.ы. характеристики сервера: debian, ispmanager, nginx, apache.

D
На сайте с 05.06.2007
Offline
155
#1

Всё просто

location / {
root /var/www/cache/data/www/$host_without_www;
try_files $uri @backend;
}

//ваш апач тут
location @backend {
proxy_pass http://127.0.0.1:8080;
...
}
Написал не мало шедевров ;)
LM
На сайте с 18.10.2009
Offline
117
#2

Dimanych, Спасибо огромнейшее. Всё работает. 🍻

D
На сайте с 05.06.2007
Offline
155
#3

рад помочь ;)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий