У меня есть стандартное приложение Rails с Nginx и Mongrel, работающее на http://mydomain. Мне нужно запустить блог Wordpress в http://mydomain.com/blog. Мое предпочтение было бы размещать блог в Apache, запущенном на одном и том же сервере или в отдельном окне, но я не хочу, чтобы пользователь видел другой URL-адрес в URL-адресе. Возможно ли это, а если нет, что бы вы рекомендовали достичь цели?
Какой лучший способ запустить Wordpress в том же домене, что и приложение Rails?
Ответ 1
Я думаю, что решение 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-адреса.
Ответ 2
Собственно, поскольку вы используете 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 script.
Ответ 3
Ответы, приведенные выше, очень подходят к вашему вопросу.
Альтернативным FCGI будет использование php-fpm. Документы немного редки, но они хорошо работают.
Ответ 4
Nginx теперь предоставляет script для этого, если вы находитесь в среде EC2/AWS.
Он может легко адаптироваться к вашей ситуации. Это очень удобно.
Ответ 5
Мне кажется, что что-то вроде манипулятора перезаписи будет делать то, что вы хотите. Извините, у меня больше нет деталей - просто вслух:)