• 解決済 uralan

    (@uralan)


    例として example.com を使ってます。
    www.example.com/Blog/ このロケーションをNginxで設定して
    バックエンドで /Blog をlocalhost:8081にプロキシしています。

    www.example.com/Blog/ は正常に表示されます。
    www.example.com/Blog/wp-admin/ でログインしてリダイレクトされると
    www.example.com/wp-admin にリダイレクトされます。
    なぜでしょうか?
    Nginxの設定は /Blog をlocalhost:8081に /Blog を消してそのままあとは伝えるだけにしてます。
    この動作のため管理画面で相対リンクで書かれているurlが404になります
    www.example.com/wp-admin も同じように404になります。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • リバースプロキシ先の nginx がサブディレクトリインストールされていることを認識できないからだと思われます。
    まず、リバースプロキシ先の nginx 設定に以下を追加してください。

    rewrite ^/Blog(/.*)$ $1 break;

    上記の設定だけでうまく行かなければ wp-config.php に以下を追加して WordPress 管理画面のURLがサブディレクトリ以下になるようにしてください。

    define( 'WP_SITEURL', 'https://www.example.com/Blog' );

    トピック投稿者 uralan

    (@uralan)

    設定は一応しているんです
    それでも事象が発生します

    これで大丈夫かわかりませんがテスト用のlocalhostで事象を再現したのを載せます

    wp-confif.php



    <?php

    /**

     * The base configuration for WordPress

     *

     * The wp-config.php creation script uses this file during the installation.

     * You don't have to use the website, you can copy this file to "wp-config.php"

     * and fill in the values.

     *

     * This file contains the following configurations:

     *

     * * Database settings

     * * Secret keys

     * * Database table prefix

     * * ABSPATH

     *

     * This has been slightly modified (to read environment variables) for use in Docker.

     *

     * @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/

     *

     * @package WordPress

     */

    // IMPORTANT: this file needs to stay in-sync with https://github.com/WordPress/WordPress/blob/master/wp-config-sample.php

    // (it gets parsed by the upstream wizard in https://github.com/WordPress/WordPress/blob/f27cb65e1ef25d11b535695a660e7282b98eb742/wp-admin/setup-config.php#L356-L392)

    // a helper function to lookup "env_FILE", "env", then fallback

    if (!function_exists('getenv_docker')) {

        // https://github.com/docker-library/wordpress/issues/588 (WP-CLI will load this file 2x)

        function getenv_docker($env, $default) {

            if ($fileEnv = getenv($env . '_FILE')) {

                return rtrim(file_get_contents($fileEnv), "\r\n");

            }

            else if (($val = getenv($env)) !== false) {

                return $val;

            }

            else {

                return $default;

            }

        }

    }

    // ** Database settings - You can get this info from your web host ** //

    /** The name of the database for WordPress */

    define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'wordpress') );

    /** Database username */

    define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'example username') );

    /** Database password */

    define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );

    /**

     * Docker image fallback values above are sourced from the official WordPress installation wizard:

     * https://github.com/WordPress/WordPress/blob/1356f6537220ffdc32b9dad2a6cdbe2d010b7a88/wp-admin/setup-config.php#L224-L238

     * (However, using "example username" and "example password" in your database is strongly discouraged.  Please use strong, random credentials!)

     */

    /** Database hostname */

    define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );

    /** Database charset to use in creating database tables. */

    define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8mb4') );

    /** The database collate type. Don't change this if in doubt. */

    define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );

    /**#@+

     * Authentication unique keys and salts.

     *

     * Change these to different unique phrases! You can generate these using

     * the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.

     *

     * You can change these at any point in time to invalidate all existing cookies.

     * This will force all users to have to log in again.

     *

     * @since 2.6.0

     */

    define( 'AUTH_KEY',         getenv_docker('WORDPRESS_AUTH_KEY', 'xxxxxxxxxx') );

    define( 'SECURE_AUTH_KEY',  getenv_docker('WORDPRESS_SECURE_AUTH_KEY', 'xxxxxxxxxx') );

    define( 'LOGGED_IN_KEY',    getenv_docker('WORDPRESS_LOGGED_IN_KEY', 'xxxxxxxxxx') );

    define( 'NONCE_KEY',        getenv_docker('WORDPRESS_NONCE_KEY', 'xxxxxxxxxx') );

    define( 'AUTH_SALT',        getenv_docker('WORDPRESS_AUTH_SALT', 'xxxxxxxxxx') );

    define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', 'xxxxxxxxxx') );

    define( 'LOGGED_IN_SALT',   getenv_docker('WORDPRESS_LOGGED_IN_SALT', 'xxxxxxxxxx') );

    define( 'NONCE_SALT',       getenv_docker('WORDPRESS_NONCE_SALT', 'xxxxxxxxxx') );

    // (See also https://wordpress.stackexchange.com/a/152905/199287)

    /**#@-*/

    /**

     * WordPress database table prefix.

     *

     * You can have multiple installations in one database if you give each

     * a unique prefix. Only numbers, letters, and underscores please!

     *

     * At the installation time, database tables are created with the specified prefix.

     * Changing this value after WordPress is installed will make your site think

     * it has not been installed.

     *

     * @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#table-prefix

     */

    $table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');

    /**

     * For developers: WordPress debugging mode.

     *

     * Change this to true to enable the display of notices during development.

     * It is strongly recommended that plugin and theme developers use WP_DEBUG

     * in their development environments.

     *

     * For information on other constants that can be used for debugging,

     * visit the documentation.

     *

     * @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/

     */

    define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );

    /* Add any custom values between this line and the "stop editing" line. */

    // If we're behind a proxy server and using HTTPS, we need to alert WordPress of that fact

    // see also https://wordpress.org/support/article/administration-over-ssl/#using-a-reverse-proxy

    if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {

        $_SERVER['HTTPS'] = 'on';

    }

    // (we include this by default because reverse proxying is extremely common in container environments)

    if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {

        eval($configExtra);

    }

    define('WP_HOME', 'http://localhost/Blog');

    define('WP_SITEURL', 'http://localhost/Blog');

    /* That's all, stop editing! Happy publishing. */

    /** Absolute path to the WordPress directory. */

    if ( ! defined( 'ABSPATH' ) ) {

        define( 'ABSPATH', __DIR__ . '/' );

    }

    /** Sets up WordPress vars and included files. */

    require_once ABSPATH . 'wp-settings.php';
    nginx.conf



    server {

        listen 80;

        server_name localhost;

        location / {

            root /usr/share/nginx/html;

            index index.html index.htm;

        }

        location /Blog/ {

            rewrite ^/Blog(/.*)$ $1 break;

            proxy_pass http://wordpress:80/;

            proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header X-Forwarded-Proto $scheme;

        }

    }
    docker-compose.yml


    version: '3.8'

    services:

      wordpress:

        image: wordpress:latest

        ports:

          - "8081:80"

        environment:

          WORDPRESS_DB_HOST: db

          WORDPRESS_DB_USER: wordpress

          WORDPRESS_DB_PASSWORD: wordpress_password

          WORDPRESS_DB_NAME: wordpress_db

        volumes:

          - wordpress_data:/var/www/html

        depends_on:

          - db

      db:

        image: mysql:5.7

        environment:

          MYSQL_ROOT_PASSWORD: root_password

          MYSQL_DATABASE: wordpress_db

          MYSQL_USER: wordpress

          MYSQL_PASSWORD: wordpress_password

        volumes:

          - db_data:/var/lib/mysql

      nginx:

        image: nginx:latest

        ports:

          - "80:80"

        volumes:

          - ./nginx.conf:/etc/nginx/conf.d/default.conf

        depends_on:

          - wordpress

    volumes:

      wordpress_data:

      db_data:

    rewrite ^/Blog(/.*)$ $1 break; はリバースプロキシ元の nginx 設定ではなく、リバースプロキシ先の nginx 設定に記載してください。
    私の環境では、この設定で問題なく動作しています。

    # リバースプロキシ元
    upstream backend {
    server unix:/var/run/nginx-backend.sock;
    }

    server {
    listen 80;
    server_name _;
    root /var/www/html;
    index index.php index.html index.htm;

    proxy_redirect off;
    proxy_cache czone;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Remote-Addr $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $proxy_proto;
    proxy_set_header X-Forwarded-Port $proxy_port;
    proxy_set_header Accept-Encoding "";
    proxy_set_header Proxy "";

    location /Blog {
    proxy_cache_key "$proxy_proto://$host$request_uri";
    proxy_cache_valid 200 0m;
    proxy_pass http://backend;
    }

    location ~ /\.ht {
    deny all;
    }
    }
    # リバースプロキシ先
    server {
    listen unix:/var/run/nginx-backend.sock;
    server_name _;
    root /var/www/html;
    index index.php index.html index.htm;

    access_log /var/log/nginx/backend.access.log;

    keepalive_timeout 25;
    port_in_redirect off;

    gzip off;
    gzip_vary off;

    rewrite ^/Blog(/.*)$ $1 break;

    # This order might seem weird - this is attempted to match last if rules below fail.
    location / {
    try_files $uri $uri/ /index.php$is_args$args;
    }

    # Pass all .php files onto a php-fpm/php-fcgi server.
    location ~ \.php$ {
    expires off;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass phpfpm;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_intercept_errors on;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    fastcgi_busy_buffers_size 32k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_param REMOTE_ADDR $http_x_real_ip;
    }
    }
    • この返信は3ヶ月、 1週前にwokamotoが編集しました。
    トピック投稿者 uralan

    (@uralan)

    すみません初心者で申し訳ないのですがwordpressは基本はApacheではないのですか?
    なのでリバースプロキシ先のNginxとは何でしょうか
    自分が思っていたのはwordpressにサイトurlを正しく設定しNginxでプロキシすれば大丈夫だと思っていたのですが

    ちょっと整理のためにお聞きしますが、
    www.example.comを表示しているWebサーバーは、Apacheなのですか?Nginxなのですか?そしてそれは、ポート8081を表示しているWebサーバーとは違うのですか。

    あと、「wordpressは基本はApacheではないのですか?」とありますが、PHPさえ扱えるWebサーバーであれば、別にApache限定というわけではないですよ。NiginxでもLiteSpeedでもIISでも、好きなの使ってください。

    トピック投稿者 uralan

    (@uralan)

    何とかネットで調べて解決することに成功しました。
    必要ないとは思いますが私が使用したdocker-compose.ymlなどを書いておきます
    あとwordpressを実行しているのはApacheでリバースプロキシににNginxを使ってます

    docker-compose.yml


    version: '3.8'

    services:

      blog:

        image: wordpress:latest

        restart: always

        volumes:

        - blog_data:/var/www/html/blog"

        working_dir: /var/www/html/blog # <- これがポイント

        links:

        - mysql:mysql-host

        environment:

          WORDPRESS_DB_HOST: mysql-host:3306

          WORDPRESS_DB_USER: wordpress

          WORDPRESS_DB_PASSWORD: wordpress

      mysql:

        image: mysql:5.7

        volumes:

        - db_data:/var/lib/mysql"

        restart: always

        environment:

          MYSQL_ROOT_PASSWORD: somewordpress

          MYSQL_DATABASE: wordpress

          MYSQL_USER: wordpress

          MYSQL_PASSWORD: wordpress

      nginx:

        image: nginx:latest

        ports:

          - "80:80"

        volumes:

          - ./nginx.conf:/etc/nginx/nginx.conf:ro

        depends_on:

          - blog

    volumes:

      blog_data:

      db_data:
    nginx.conf


    events {

        worker_connections 1024;

    }

    http {

        upstream blog_backend {

            server blog:80;

        }

        server {

            listen 80;

            server_name localhost;

            location /blog {

                proxy_pass http://blog_backend;

                proxy_set_header Host $host;

                proxy_set_header X-Real-IP $remote_addr;

                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                proxy_set_header X-Forwarded-Proto $scheme;

            }

        }

    }
    モデレーター 瀬戸内ことり (Setouchi Kotori)

    (@setouchikotori)

    解決したようで何よりです。

    最終的にはご自身で解決されたとしても、あなたのために時間を割いてくださった @wokamoto さんや @mokkosan さんへの感謝の意をお示しいただくとよいのではないかなと、その1点が気になりました。

    ここで質問やヘルプを求めたとき、答えることで直接の報酬をもらえる人はいません。回答してくれる人に対しての礼儀を忘れないようにしてください。

    フォーラム詳細ルール

    ──

    @wokamoto さん、 @mokkosan さん、トピック解決に向けてご協力いただきありがとうございました^^

    トピック投稿者 uralan

    (@uralan)

    感謝の言葉を忘れていました
    @wokamotoさんと@mokkosanさん
    無知な初心者のために時間を割いていただきありがとうございました。
    今後ともご縁がありましたらよろしくお願いします 

8件の返信を表示中 - 1 - 8件目 (全8件中)

このトピックに返信するにはログインが必要です。