У меня есть стандартное приложение Rails с Nginx и Mongrel, работающим по адресу http: // mydomain . Мне нужно запустить блог WordPress по адресу http://mydomain.com/blog . Мое предпочтение было бы размещать блог в Apache, запущенном на одном и том же сервере или в отдельном окне, но я не хочу, чтобы пользователь видел другой URL-адрес в URL-адресе. Возможно ли это, а если нет, что бы вы рекомендовали достичь цели?
Я думаю, что решение joelhardi превосходит следующее. Однако в моем собственном приложении мне нравится вести блог на отдельном VPS, чем на Rails-сайте (разделение проблем с памятью). Чтобы пользователь увидел один и тот же URL-адрес, вы используете тот же прокси-трюк, который обычно используется для проксирования в кластер монгеров, кроме прокси-сервера на порт 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-адреса.
На самом деле, поскольку вы используете 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-spwner (Lighttpd – довольно быстрая компиляция без каких-либо странных зависимостей, поэтому быстро и легко установить), но вы также можете используйте для этого короткий сценарий оболочки / Perl.
Ответы, приведенные выше, довольно решают ваш вопрос.
Альтернативным FCGI будет использование php-fpm. Документы немного редки, но они хорошо работают.
Nginx теперь предоставляет сценарий для этого, если вы находитесь в среде EC2 / AWS.
Он может легко адаптироваться к вашей ситуации. Это очень удобно.
Мне кажется, что что-то вроде манипулятора перезаписи будет делать то, что вы хотите. Извините, у меня больше нет деталей – просто вслух 🙂