У меня есть стандартное приложение Rails с Nginx и Mongrel, работающим на http: // мойдомен. Мне нужно вести блог Wordpress по адресу http://mydomain.com/blog. Я бы предпочел разместить блог в Apache, работающем либо на том же сервере, либо в отдельном окне, но я не хочу, чтобы пользователь видел другой сервер в URL-адресе. Возможно ли это, и если нет, что бы вы порекомендовали для достижения цели?






Мне кажется, что что-то вроде манипулятора перезаписи будет делать то, что вы хотите. Извините, у меня больше нет подробностей - просто думаю вслух :)
На самом деле, поскольку вы используете Nginx, вы уже в отличной форме и вам не нужен Apache.
Вы можете запускать PHP через fastcgi (есть примеры того, как это сделать в вики Nginx) и использовать шаблон сопоставления URL-адресов в вашей конфигурации Nginx, чтобы направлять одни URL-адреса на Rails, а другие - на PHP.
Вот пример конфигурации Nginx для ведения блога WordPress через PHP fastcgi (обратите внимание, что я также добавил Nginx-эквивалент WordPress .htaccess, поэтому у вас также будут причудливые URL-адреса, уже работающие с этой конфигурацией):
server {
listen example.com:80;
server_name example.com;
charset utf-8;
error_log /www/example.com/log/error.log;
access_log /www/example.com/log/access.log main;
root /www/example.com/htdocs;
include /www/etc/nginx/fastcgi.conf;
fastcgi_index index.php;
# Send *.php to PHP FastCGI on :9001
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
}
# You could put another "location" section here to match some URLs and send
# them to Rails. Or do it the opposite way and have "/blog/*" go to PHP
# first and then everything else go to Rails. Whatever regexes you feel like
# putting into "location" sections!
location / {
index index.html index.php;
# URLs that don't exist go to WordPress /index.php PHP FastCGI
if (!-e $request_filename) {
rewrite ^.* /index.php break;
fastcgi_pass 127.0.0.1:9001;
}
}
}
Вот файл fastcgi.conf, который я включаю в приведенную выше конфигурацию (я помещаю его в отдельный файл, чтобы все файлы конфигурации моего виртуального хоста могли включать его в нужное место, но вам не нужно этого делать):
# joelhardi fastcgi.conf, see http://wiki.codemongers.com/NginxFcgiExample for source
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
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 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;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param REDIRECT_STATUS 200;
Я также делаю то, что предлагает вики Nginx, и использую spawn-fcgi из Lighttpd в качестве моего CGI-spawner (Lighttpd - это довольно быстрая компиляция без странных зависимостей, поэтому ее легко и быстро установить), но вы также можете используйте для этого короткий сценарий оболочки / Perl.
Я думаю, что решение Джоэлхарди превосходит следующее. Однако в моем собственном приложении я предпочитаю вести блог на отдельном VPS, а не на сайте Rails (разделение проблем с памятью). Чтобы пользователь видел один и тот же URL-адрес, вы используете тот же трюк с прокси-сервером, который вы обычно используете для проксирования в кластер mongrel, за исключением того, что вы проксируете порт 80 (или что-то еще) на другом поле. Очень просто. Для пользователя это так же прозрачно, как проксирование на mongrel - они «видят» только NGINX, отвечающий на порт 80 в вашем домене.
upstream myBlogVPS {
server 127.0.0.2:80; #fix me to point to your blog VPS
}
server {
listen 80;
#You'll have plenty of things for Rails compatibility here
#Make sure you don't accidentally step on this with the Rails config!
location /blog {
proxy_pass http://myBlogVPS;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Кстати, вы можете использовать этот трюк, чтобы заставить Rails подыгрывать ЛЮБОЙ серверной технологии, которую вы хотите. Прокси-сервер напрямую к соответствующему серверу / порту, и NGINX скроет его от внешнего мира. Кроме того, поскольку все URL-адреса будут относиться к одному и тому же домену, вы можете без особого труда интегрировать блог на основе PHP, систему отслеживания на основе Python и приложение Rails - при условии, что вы правильно напишете URL-адреса.
Проксирование подойдет вам, но влечет за собой ряд проблем. Одно из них - производительность немного хуже. Во-вторых, вам придется изменить код на своем внутреннем сервере, чтобы он знал, что он работает за прокси-сервером, и должен смотреть на такие вещи, как X-Forwarded-For (который на самом деле является ...
... массив IP-адресов, не обязательно один адрес, b / c множество пользователей работают за корпоративными прокси-серверами или прокси-серверами ISP, и вы хотите извлечь фактический IP-адрес пользователя, если ваше приложение что-то с ним делает. Также X-Forwarded-For - это значение, установленное пользователем, поэтому оно не является "доверенным" - см. Apache mod_extract_forwarded для получения дополнительной информации ...
... инфа есть. (Проксирование полезно для изучения, вы можете однажды использовать Varnish или Squid!) Другой вариант, помимо HTTP-прокси, - это настроить FCGI для прослушивания порта в окне приложения (таким образом я настроил кластер приложений для PHP FCGI) - Nginx просто обращается к 192.168.0.8:9001 вместо 127.0.0.1:9001. Ваше здоровье!
Не могли бы вы помочь в чем проблема с этим serverfault.com/questions/116589/…
Приведенные выше ответы вполне подходят для вашего вопроса.
Альтернативой FCGI было бы использование php-fpm. Документов немного, но все работает хорошо.
Nginx теперь предоставляет сценарий для этого, если вы находитесь в среде EC2 / AWS.
Его можно легко адаптировать к вашей ситуации. Это очень удобно.
Согласитесь, решение fastcgi работало нормально, когда оно находилось на одном сервере, хотя мне пришлось переустановить / обновить NGINX и php, потому что fastcgi изначально не был включен. Для отдельного сервера это решение, похоже, работает хорошо - если кто-нибудь знает о каких-либо проблемах, добавьте их.