Nginx + サブディレクトリ wordpressでパーマリンク変更後に404が出る

/magazine でwordpressを設置しているプロジェクトでパーマリンクを変更したところ、タイトルのようなエラーが発生しました

とりあえず結論

location /magazine {
  # alias /var/www/html/blog;
  root /var/www/html;
  try_files $uri $uri/ /magazine/index.php?q=$request_uri;
}

元々は/blog で運用することを検討していたので、EC2の中のディレクトリは

  • /var/www/app -> Rails
  • /var/www/html/blog -> wordpress

で構成しておりました

しかし途中で /blog ではなく/magazine で運用したいという要望が出てきたため、
location部分を変更したのですが、タイトルのエラーに遭遇、という流れです

で、やったこととしては、/blog をディレクトリ丸々コピーして /magazine として作成、そして上記のように振り向けることで解決、となります

参考記事

nginx fails to load wordpress subfolder using different root location

go-playground/validatorでvalidationが走らない

structにvalidationを実装していて、なぜかvalidationが発火しない事件が発生しました

type Body struct {
	value string `validate:"required" ja:"内容"`
}

個人的には全く問題ないと思っていたのですが、どうやらGoではlower caseはprivateな扱いとなり、エンコード/デコードされないようです

なので、小文字で変換が発生しないことは正常であり、大文字に直すことで上記は対応することができました🙌

参考記事

【Golang】structのField名で気をつけるところ

Public、Private【Go】

M1 + Rails + SQLiteがnative extension関連でエラーでる

こちらがエラーの詳細

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sqlite3-1.3.13/ext/sqlite3
/Users/masahirookubo/.rbenv/versions/2.7.2/bin/ruby -I /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/site_ruby/2.7.0 -r ./siteconf20220124-84840-1c5966v.rb extconf.rb
checking for sqlite3.h... yes
checking for pthread_create() in -lpthread... yes
checking for sqlite3_libversion_number() in -lsqlite3... no
sqlite3 is missing. Try 'brew install sqlite3',
'yum install sqlite-devel' or 'apt-get install libsqlite3-dev'
and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/masahirookubo/.rbenv/versions/2.7.2/bin/$(RUBY_BASE_NAME)
	--with-sqlite3-config
	--without-sqlite3-config
	--with-pkg-config
	--without-pkg-config
	--with-sqlite3-dir
	--without-sqlite3-dir
	--with-sqlite3-include
	--without-sqlite3-include=${sqlite3-dir}/include
	--with-sqlite3-lib
	--without-sqlite3-lib=${sqlite3-dir}/lib
	--with-pthread-dir
	--without-pthread-dir
	--with-pthread-include
	--without-pthread-include=${pthread-dir}/include
	--with-pthread-lib
	--without-pthread-lib=${pthread-dir}/lib
	--with-pthreadlib
	--without-pthreadlib
	--with-sqlite3lib
	--without-sqlite3lib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/extensions/x86_64-darwin-20/2.7.0/sqlite3-1.3.13/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sqlite3-1.3.13 for inspection.
Results logged to /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/extensions/x86_64-darwin-20/2.7.0/sqlite3-1.3.13/gem_make.out

  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/site_ruby/2.7.0/rubygems/ext/builder.rb:92:in `run'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/site_ruby/2.7.0/rubygems/ext/ext_conf_builder.rb:47:in `block in build'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/2.7.0/tempfile.rb:291:in `open'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/site_ruby/2.7.0/rubygems/ext/ext_conf_builder.rb:26:in `build'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/site_ruby/2.7.0/rubygems/ext/builder.rb:158:in `build_extension'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/site_ruby/2.7.0/rubygems/ext/builder.rb:192:in `block in build_extensions'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/site_ruby/2.7.0/rubygems/ext/builder.rb:189:in `each'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/site_ruby/2.7.0/rubygems/ext/builder.rb:189:in `build_extensions'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/site_ruby/2.7.0/rubygems/installer.rb:837:in `build_extensions'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/rubygems_gem_installer.rb:66:in `build_extensions'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/rubygems_gem_installer.rb:26:in `install'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/source/rubygems.rb:199:in `install'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/installer/gem_installer.rb:54:in `install'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/installer/gem_installer.rb:16:in `install_from_spec'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/installer/parallel_installer.rb:186:in `do_install'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/installer/parallel_installer.rb:177:in `block in worker_pool'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/worker.rb:62:in `apply_func'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/worker.rb:57:in `block in process_queue'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/worker.rb:54:in `loop'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/worker.rb:54:in `process_queue'
  /Users/masahirookubo/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/worker.rb:91:in `block (2 levels) in create_threads'

An error occurred while installing sqlite3 (1.3.13), and Bundler cannot continue.

こちら実行することで解消できました🙌

bundle config build.sqlite3 --with-sqlite3-lib="/usr/lib"
bundle install

参考記事

https://github.com/railsinstaller/railsinstaller-windows/issues/111#issuecomment-986998444

EC2でSSL有効化したらWordPressのCSSが効かなくなった

ACMでSSLを有効化したら、EC2インスタンスで動いているWordPressのCSSが動かなくなってしましました

結論wordpressのwp-config.phpにこちらを追加することで直ります

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

参考記事

WordPressでSSL化したとき、CSSやJavaScriptがhttpのままで読み込めないときの対処法

EC2のSSH接続でport 22: Operation timed outが出る問題

直し方の結論、

Public IPの末尾1桁が抜けていました!!!

夜作業していて、途中で諦めて朝から作業していたのですが、IPがあっているか確認している途中に気がつきました。。。

皆さんも気をつけてください🙇‍♂️

参考記事

【AWS EC2 エラー】ssh port 22 Operation timed out

AWS ssh access ‘port 22: Operation timed out’ issue

AWS EC2でRailsの環境変数更新したのに反映されない問題の解消法

EC2の環境変数を更新したにもかかわらずなぜか環境変数が更新されずに、S3に繋げれない、と言う問題が発生しました。。。。

Herokuだと変更するたびにbuildが走るのでAWSも勝手に完了するものかと思っていましたが、
どうやらunicorn等のサーバーを再起動しないとダメらしく、こちらのコマンド実行で対処しました

ps aux | grep unicorn

# pidを全部killする
kill 1111

# unicorn再起動
unicorn_rails -c config/unicorn.rb -E production -D

参考記事

AWSのEC2で環境変数(ENV)を読み込めない

Selenium::WebDriver::Error::SessionNotCreatedError: session not created: This version of ChromeDriver only supports Chrome version 92 Current browser version is 97.0.4692.71の解決方法

定期的にタイトルのエラーが発生するのですが、いつも苦労して気がついたら治ってて。。。。
みたいなことの連続なので、今回はメモとして残してみました

根本の問題

そのままでchrome driverのversionがあっていない、が問題です

ただ、個人的に気になったのは、

brew uninstall chromedriver

しても、なぜか、タイトルのエラーが発生してどうやらbrew経由でinstallしたchrome driverとは関係なさそうな感じ。。。

解決策

ググってみたらこんな記事発見

RSpecでchromedriverとChromeのバージョンが合わない

chromedriver-helperと言うgemがサポート終了しても入っていると、それが原因でversion違いが起こってるのでは?と言うことが書いてありました

なのでこちらを実行

gem list

....
chromedriver-helper (2.1.1)
...

なんと入ってました!!!!

なので、こちらをdeleteします
※ちなみにGemfileにも入っていたのでコメントアウトしました🙌

gem uninstall chromedriver-helper

その後、rspec走らせたら動きました!!!!!!!!

Registrations
  User
    password correct
2022-01-17 23:44:44 WARN Selenium [DEPRECATION] [:browser_options] :options as a parameter for driver initialization is deprecated. Use :capabilities with an Array of value capabilities/options if necessary instead.
      succeeds

Top 1 slowest examples (32.77 seconds, 100.0% of total time):
  Registrations User password correct succeeds
    32.77 seconds ./spec/system/users/registrations_system_spec.rb:12

Finished in 32.78 seconds (files took 2.74 seconds to load)
1 example, 0 failures

Randomized with seed 30581

Coverage report generated for RSpec to /Users/masahirookubo/client/world_alive/driver_app/coverage. 210 / 867 LOC (24.22%) covered.

AWS EC2でRailsの/blogルートでWordPressを表示する

Railsの/blog ルートでwordpressを表示しようと思ったら、思いの他詰まってしまったので、
後続の方もいらっしゃるかと思って、記事にまとめました🙏

そもそもですが、最近のトレンドでは

  • システム -> http://example.com/
  • ブログ -> http://blog.example.com/

で実装することが多いと思いますが、ちょっとした好奇心と、お客様でもしかしたらやりたいかも?
みたいなタイミングが一致したのでチャレンジした、という経緯です

最終的にはこのようなurl実装

  • システム -> http://example.com/
  • ブログ -> http://example.com/blog
  • 一応見出しでわかりやすくまとめたつもりですが、
    いきなり着手せずに、まずは下までスクロールして落ち着いて確認してください🙏

    実現方法

    結論、nginxのリバースプロキシで実現が可能です

    参考にしたのはこちらの記事

    AWS上でRailsアプリとWordPressをnginxで共存させる

    上記のリンクを参考にして実装しましたが、最終的にnginxのconfはこんな感じになりました

    upstream unicorn {
            server unix:/var/www/your_app_name/shared/tmp/sockets/unicorn.sock;
    }
    
    server {
            listen       80;
            server_name  xx.xxx.xxx.xxx;
            root         /var/www/your_app_name/current/public;
    
            location /blog {
                    index   index.html index.htm index.php;
                    alias /var/www/html/blog;
                    location ~ \.php$ {
                            fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
                            fastcgi_index  index.php;
                            fastcgi_param SCRIPT_FILENAME $request_filename;
                            include        fastcgi_params;
                    }
            }
    
            location ^~ /assets/ {
                    gzip_static on;
                    expires max;
                    add_header Cache-Control public;
            }
    
            location @unicorn {
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header Host $http_host;
    
                    proxy_redirect off;
                     proxy_pass http://unicorn;
            }
    
            try_files $uri/index.html $uri @unicorn;
            error_page 500 502 503 504 /500.html;
    }

    要点の説明

    要点を説明するにあたって、どのように実装したか?の参考記事がこちら

    Railsについて

    【Rails】 AWSのEC2にデプロイする方法~画像で丁寧に解説!

    Rails】 Capistranoを使ってデプロイを自動化しよう

    WordPressについて

    Amazon EC2(Amazon Linux)でWordPressをインストールし、Nginxで表示させる手順2
    「MySQLサーバーの設定」という項目は下記の記事を参考にしています
    現在はMySQLではなくMariadbが主流のようです

    【AWS】EC2にWordPressをインストール(構築)する

    どうやったか

    それぞれの実装は上記を参考にすれば、手順通り進めていけば問題なく実装可能かと思います

    おそらくこの記事を読んでいる方は、「Railsはできたけど、wordpressを埋め込めない」という状況かなと

    私も同じ状況で、とった手順としては

    • まずはwordpressを/var/www/htmlに展開 -> nginx経由で公開
    • その後に/var/www/html/blogをmkdirして、そこに作成したwordpressファイルを移動
    • nginxでlocation /blog/を追加して、まずはwordpressだけを公開
    • その後にrailsをrootで使えるようにする

    という流れです

    この方法に変更したところ、詰まっていたことが嘘のようにとんとん拍子に進みました

    やはりRailsを実装してからだと、Railsの影響範囲が大きいですし、問題の場所がわからなくなってしまうので、もし自分がもう一度実装するとしても、上記の流れで行うと思います

    チャレンジしたことと詰まったポイント

    実際この作業は3 ~ 4日間かけて行っていたので、相当に詰まって、無駄なことをたくさんしました

    自分が発生させた無駄な作業を少しでも回避してもらえればと思いますので、ぜひ参考にしてください🙏

    Herokuの中でDockerで実現させようとした

    私はフルスタックを名乗っていますが、インフラは最低限のことしかできません。。。。

    なので通常Herokuを使って実装していました

    いつもHerokuを使っているため、Herokuであることは確定させ、Herokuで実装するためには、

    • Dockerの中に複数のコンテナ作成して対応
    • Herokuのapacheかnginxを直接修正して対応
    • Railsのpublic dirにwordpress入れて、dbをmysqlのaddonで対応

    等の案が思い浮かんでました。

    結論から言うと、全部だめでした

    Dockerに関してこちらのリポジトリで実装したのですが、
    どうやらHeorkuのDockerではEXPOSE等のいくつかの設定が利用できなかったり、
    docker-compose.ymlでpushできると思っていたら、Dockerfileごとだったりと、
    インフラ知識が弱い故に相当な時間を注ぎ込み、実現が難しい、EC2の方が簡単、
    と言うことがわかりました

    その他二つに関しても調べれば調べるほどHerokuではなくEC2の方が簡単、という結論に至り、
    Herokuは捨てて、EC2で実装する、と言う方針へ転換

    DockerでRails + WordPress + Nginx reverse proxyの参考リポ: masahiro04/docker-sample 

    Rails入れてからwordpress入れたがphp-fpm入れてなかった

    EC2にRailsを実装できて、reverse proxyでwordpressに飛ばすわけですが、
    インフラわからなさすぎて、php-fpm入れていないくて、phpが動かず
    結構ハマりました。。。。

    インフラ初心者であれば、記事を内容を飛ばしたり、カスタムせずにとりあえず右に倣えが良いかと思います

    SSL入れていないのにhttpsにアクセスして5時間飛ばした

    RailsをEC2にデプロイすることができたのですが、なぜか表示されない。。。。と言う現象が発生しました

    configファイルでforce sslをtrueにしていたため、SSLは設定されていない、だけどhttpsに飛ばされていて、
    画面が表示されない、となっていました

    こちらの記事を参考にしてください: AWS + Rails + Capistranoで何もエラーないのに表示されない問題

    小さな問題を大きくしすぎた

    上記のphpが動かない、という問題自体は簡単だと思うのですが、問題と影響範囲を分けなかったことは失敗でした

    RailsとWordpressそれぞれを分けて作成して、その後どちらかに足りていない、RailsかWordpressを入れる、と言うこともできたので、まずは問題を切り分けて解決することが大切だと、改めて認識です🙇‍♂️

    EC2のインスタンスを複数作ることをしなかった

    面倒なので全部一つのインスタンスで実装していましたが、間違いでした

    金額も安いので、RailsとWordpress、さらに統合用のインスタンスを作成、とかでも全然問題ないと思いますので、今悩んでいるぐらいならサクッと作ってしまいましょう
    ※金額が増えたとしても責任は取れませんので、あくまでもご自身の判断で

    最後に

    私自身インフラ知識が希薄で詰まったおかげでかなり理解が進みました

    ネット上の情報が少なく、結構苦労したので、もし悩んでいる方の参考となれば幸いです🙏

    上記情報で足りなくて、どうしてもということでしたらtwitterのDMもらえればZoomで少し通話もできるので、
    ご連絡ください🙌

    AWS EC2 Linux でgem install mysql2 -v ‘0.5.3’するとエラーが出る

    AWS EC2でrails環境を構築中にタイトルコマンド実行でエラーが発生しました

    gem install mysql2 -v '0.5.3'
    
    Building native extensions. This could take a while...
    ERROR:  Error installing mysql2:
            ERROR: Failed to build gem native extension.
    
        current directory: /home/ec2-user/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/mysql2-0.5.3/ext/mysql2
    /home/ec2-user/.rbenv/versions/2.7.2/bin/ruby -I /home/ec2-user/.rbenv/versions/2.7.2/lib/ruby/2.7.0 -r ./siteconf20220116-18846-rjobkk.rb extconf.rb
    checking for rb_absint_size()... yes
    checking for rb_absint_singlebit_p()... yes
    checking for rb_wait_for_single_fd()... yes
    *** extconf.rb failed ***
    Could not create Makefile due to some reason, probably lack of necessary
    libraries and/or headers.  Check the mkmf.log file for more details.  You may
    need configuration options.

    どうやらyumこちらを追加しないといけないようなので追加して再度実行

    sudo yum install mysql-devel
    gem install mysql2 -v '0.5.3'
    
    Building native extensions. This could take a while...
    Successfully installed mysql2-0.5.3
    Parsing documentation for mysql2-0.5.3
    Installing ri documentation for mysql2-0.5.3
    Done installing documentation for mysql2 after 0 seconds
    1 gem installed
    

    上記で問題なくinstallできました!!

    参考記事

    【AmazonLinux2】MySQL2のGemをインストールする際にエラー