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

StackOverflow https://stackoverflow.com/questions/89504

Вопрос

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

Это было полезно?

Решение

Я думаю, что решение Джоэлхарди превосходит следующее.Однако в моем собственном приложении я предпочитаю хранить блог на отдельном VPS, а не на сайте Rails (проблемы разделения памяти).Чтобы пользователь видел тот же URL-адрес, вы используете тот же трюк с прокси, который вы обычно используете для проксирования к кластеру дворняг, за исключением того, что вы проксируете порт 80 (или что-то еще) на другом компьютере.Очень просто.Для пользователя это так же прозрачно, как проксирование для дворняги — они «видят» только 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-спавнера (Lighthttpd — довольно быстрая компиляция без странных зависимостей, поэтому его можно быстро и легко установить), но вы также можете используйте для этого короткий сценарий оболочки/Perl.

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

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

Nginx сейчас предоставляет сценарий для этого если вы работаете в среде EC2/AWS.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top