Как лучше всего запустить Wordpress в том же домене, что и приложение Rails?
-
01-07-2019 - |
Вопрос
У меня есть стандартное приложение 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.
Его можно легко адаптировать к вашей ситуации.Это очень удобно.
Мне кажется, что что-то вроде манипулятора перезаписи будет делать то, что вы хотите.Извините, подробностей у меня нет, просто мысли вслух :)