Nginx + nodejs + php

У меня есть конкретная схема URI, которая вызывает у меня некоторые проблемы. Мне нужно запустить nodejs, чтобы обслуживать следующее:

domain.com
var.domain.com
var.domain.com/foo/

У меня нет проблем с использованием express.vhost() для обслуживания поддоменов. Тем не менее, мне нужно обслуживать статический контент и php, как только URI будет выглядеть следующим образом:

var.domain.com/foo/bar
var.domain.com/foo/bar/index.php

Здесь /bar/ - это некоторая директория на моем сервере. Все, начиная с этого URL-адреса (скажем /bar/images/favicon.ico), будет служить вашей типичной схемой каталогов. Обычно я делал типичный proxy_pass для node, работающий на каком-то порту, но, как вы можете видеть здесь, мне нужно, чтобы nodejs был основным обработчиком на порту 80, и передал ли он запрос на nginx, запущенный на каком-то другом порту ( Или это было бы возможно/проще по-другому?).

Возможна ли такая схема с конфигурацией (nginx/php)/nodejs?

Ответ 1

Nginx позволяет очень гибкую маршрутизацию запросов. Я покажу вам способ настройки

  • маршрут по умолчанию, переданный в node.js backend
  • другой маршрут, переданный в php-fpm бэкэнд
  • альтернативный маршрут, переданный на типичный бэкэнд apache + mod_php
  • получили js, images, css и другие файлы на машине nginx? служить им самый быстрый путь непосредственно из nginx

Мне нравится, и я думаю, что макет настройки по умолчанию для большинства дистрибутивов имеет conf.d и vhosts.d каталоги с папками active и available. Поэтому я могу легко отключить vhost или файл конфигурации, просто удалив символическую ссылку.

/etc
     nginx.conf
     vhosts.d/
          active
          available
     conf.d/
          active
          available

/etc/nginx.conf

# should be 1 per CPU core    
worker_processes        2;                         

error_log               /var/log/nginx/error.log;

# I have this off because in our case traffic is not monitored with nginx and I don't want disks to be flooded with google bot requests :)
access_log              off;
pid                     /var/run/nginx.pid;

events {
        # max clients = worker_processes * worker_connections
        worker_connections      1024;
        # depends on your architecture, see http://wiki.nginx.org/EventsModule#use
        use                     epoll;
}

http {

        client_max_body_size    15m;

        include                 mime.types;
        default_type            text/html;
        sendfile                on;
        keepalive_timeout       15;

        # enable gzip compression
        gzip                    on;
        gzip_comp_level         6;
        gzip_types              text/plain text/css text/xml application/x-javascript application/atom+xml application/rss+xml application/json;
        gzip_http_version       1.0;


        # Include conf.d files
        include conf.d/active/*.conf;

        # include vhost.d files
        include vhosts.d/active/*.conf;
}

/etc/nginx/vhosts.d/available/default.conf

Скажем, что наш корневой каталог для статических файлов /srv/www/vhosts/static/htdocs

server {
    server_name _;
    listen      80;

    root        /srv/www/vhosts/static/htdocs;

    # if a file does not exist in the specified root and nothing else is definded, we want to serve the request via node.js
    try_files   $uri    @nodejs;          

    # may want to specify some additional configuration for static files
    location ~ \.(js|css|png|gif|jpg)
    {
         expires 30d;
    }

    location @nodejs
    {
         # say node.js is listening on port 1234, same host         
         proxy_pass  127.0.0.1:1234;
         break;
    }

    # just for fun or because this is another application, we serve a subdirectory via apache on another server, also on the other server it not /phpmyadmin but /tools/phpMyAdmin
    location /phpmyadmin {
         rewrite /phpmyadmin(.*)$   /tools/phpMyAdmin$1;
         proxy_pass                 10.0.1.21:80;
         break;
    }

    # files with .php extension should be passed to the php-fpm backend, socket connection because it on the same and we can save up the whole tcp overhead
    location ~\.php$
    {
         fastcgi_pass unix:/var/run/php-fpm.sock;
         include /etc/nginx/fastcgi_params;
         break;
    }
}

создать символическую ссылку, чтобы сделать активным по умолчанию vhost

ln -s /etc/nginx/vhosts.d/available/default.conf /etc/nginx/vhosts.d/active/.
/etc/init.d/nginx restart

Посмотрите, насколько простой и интуитивно понятный язык программирования nginx? Мне просто нравилось это:)