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 (например, /bar/images/favicon.ico ), будет служить вашей типичной схемой каталогов. Обычно я делал типичный proxy_pass для узла, работающего на каком-то порту, но, как вы можете видеть здесь, мне нужно, чтобы nodejs был основным обработчиком на порту 80, и передал ли он запрос на nginx, запущенный на каком-то другом порту (или это возможно / проще наоборот?).

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

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

  • маршрут по умолчанию, переданный серверу node.js
  • другой маршрут, переданный в php-fpm- сервер
  • альтернативный маршрут, переданный типичному серверу apache + mod_php
  • получили js, изображения, 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's 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's 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? Мне просто нравилось это 🙂