Какой лучший способ запустить Wordpress в том же домене, что и приложение Rails? - PullRequest
12 голосов
/ 18 сентября 2008

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

Ответы [ 5 ]

7 голосов
/ 18 сентября 2008

На самом деле, поскольку вы используете 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 довольно быстро компилируется без странных зависимостей, поэтому его легко и быстро установить), но для этого вы также можете использовать короткий сценарий shell / Perl.

5 голосов
/ 18 сентября 2008

Я думаю, что решение Джоэлхарди превосходит следующее. Однако в моем собственном приложении я предпочитаю вести блог на отдельном 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-адреса.

1 голос
/ 02 сентября 2012

Nginx сейчас предоставляет скрипт для этого , если вы находитесь в среде EC2 / AWS.

Может быть легко адаптироваться к вашей ситуации. Это очень удобно.

1 голос
/ 08 апреля 2009

Ответы выше довольно адресованы вашему вопросу.

Альтернативой FCGI было бы использование php-fpm. Документы немного редки, но это хорошо работает.

0 голосов
/ 18 сентября 2008

Мне кажется, что что-то вроде манипулятора перезаписи будет делать то, что вы хотите. Извините, у меня нет больше деталей - просто мысли вслух:)

...