Подтвердить что ты не робот

Какой лучший способ запустить Wordpress в том же домене, что и приложение Rails?

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

4b9b3361

Ответ 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

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