0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Viteの開発環境をNginxで公開する時の諸注意(特にバックエンド周り)

Posted at

Dockerで以下のような構成でvite+vueで開発

バックエンドはrails-apiで http://api:3000 でアクセスさせます。
バックエンドは公開しないので、dockerで公開ポートは設定せずdocker内からのアクセスのみとします。

vue-rails2.jpg

viteからバックエンドへのアクセス

開発環境のviteからバックエンドapiへのアクセスは
vite.config.jsで以下のように設定。
これでjsコード内でaxiosなどで使って/api/*へのアクセスをproxyすることができます。

vite.config.js
~~~~~~~
export default defineConfig({
  server: {
    proxy: {
      "/api": {
        target: "http://api:3000", // 代理先のサーバー
        changeOrigin: true, // オリジンを変更する
        rewrite: (path) => path.replace(/^\/api/, ''), // プレフィックスを削除
      }
    },
    watch: {
      usePolling: true
    },
  },
~~~~~~~

rails-api側にもconfig.hosts.clearを設定

configenvironments/development.rb
Rails.application.configure do
    ~~~~~~~
    config.hosts.clear
end

viteを本番用にbuild

viteは開発環境なのでjsなどをbuild(コンパイル)してデプロイします。
初期設定ではdistフォルダに作成されます。

# npmの場合
npm run build
# yarnでbuildする場合
yarn run build

nginx-vue.jpg

nginxでdistフォルダを参照

viteでデプロイされたdistフォルダをdocker上でbindマウントさせれば、
viteを意識することなく、nginxでvue.jsのSPAを公開できます。
(この設定はdocker composeになるので割愛)

nginxのproxy設定

viteでproxyしていたバックエンドへのアクセス設定は、buildで勝手にコンパイルされません。
nginxに設定する必要があります。

default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    ##axiosのバックエンドへのアクセス/api~をapi:3000へproxyする
    location ~ ^/api {
        proxy_pass http://api:3000;
        rewrite /api(.*)$ $1 break;
    }

nginxにSPAの遷移設定

SPAの遷移もnginxに描いておかないと/から遷移すると404になってしまいます。
以下のようにすると404の遷移もindex.htmlになってしまうので、jsでなんとかする。

default.conf
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

参考

【余談】nginxのrewriteの設定(自分メモ)

ここからは余談となります。
nginxのproxy設定のrewriteの挙動を確かめたいと思い、default.confのrewriteのbreakをpermanentに書き換え、nginxを再起動。

default.conf
    location ~ ^/api {
        proxy_pass http://api:3000;
-        rewrite /api(.*)$ $1 break;
+        rewrite /api(.*)$ $1 permanent;
    }

うぎゃー

スクリーンショット 2024-11-17 18.48.15.png

エラーメッセージ

TypeError: Cannot read properties of undefined (reading '0')

パラメータを変えただけでバックエンドにproxyできなくなった。

で、問題はこの後で、以下のように元に戻して、nginxを再起動。

default.conf
    location ~ ^/api {
        proxy_pass http://api:3000;
+        rewrite /api(.*)$ $1 break;
    }

しかし、chromeの画面は変わらない…。なんでや。
さんざん別のパラメータを変えるなどしましたが、結論は以下でした。

chromeのキャッシュを削除

nginxの挙動がおかしかったらキャッシュを疑おう。

参考

肝心のnginxのrewriteパラメータは以下を参照

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?