Menjalankan Rails 6 di Nginx dengan Puma
Mendaringkan aplikasi rails
. Kita bisa memanfaatkan puma
sebagai reverse-proxy
yang nantinya bisa kita integrasikan dengan nginx
. Berikut ini caranya:
Pertama-tama kita sunting berkas config/puma.rb
:
## letakan app_dir paling atas
app_dir = File.expand_path '../..', __FILE__
### untuk bind bebas mau ditaru di mana pun, yang terpenting sesudah app_dir
bind ENV.fetch("SOCKETFILE") { "unix://#{app_dir}/tmp/sockets/puma.sock" }
Kemudian buat service file menggunakan systemd
:
$ sudo touch /etc/systemd/system/puma.service
$ sudo vim /etc/systemd/system/puma.service
Asumsi berkas rails
kalian terletak di /home/web/rails
, skrip systemd
-nya sebagai berikut:
[Unit]
Description=Puma Rails Server
After=network.target
[Service]
Type=simple
User=web
WorkingDirectory=/home/web/rails/
ExecStart=/home/web/.rbenv/shims/puma -C /home/web/rails/config/puma.rb /home/web/rails/config.ru
ExecStop=/home/web/.rbenv/shims/pumactl -S /home/web/rails/tmp/pids/server.pid stop
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.target
Pada skrip di atas puma
berada di direktori .rbenv/shims
ini karena contoh di sini untuk pengguna rbenv. Untuk memastikan di mana puma
berada kalian bisa menggunakan perintah which
, contoh:
$ which puma
$ which pumactl
Setelah selesai, tinggal kita reload dan jalankan puma
-nya.
$ sudo systemctl daemon-reload
$ sudo systemctl start puma.service
$ sudo systemctl status puma
Jika sudah hijau berati kita sudah berhasil membuat puma
dengan systemd
. Langkah selanjutnya adalah kita buat server block
di Nginx. Dan masukan konfirgurasinya seperti berikut:
upstream app {
server unix:///home/web/rails/tmp/sockets/puma.sock;
}
server {
root /home/web/rails/public/;
location / {
try_files $uri @app;
}
location @app {
proxy_pass http://app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
}
}
Khusus Pengguna https
Ubah pada baris @app
menjadi seperti berikut:
....
location @app {
proxy_pass http://app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Ssl on;
proxy_redirect off;
}
Terakhir tinggal kita restart nginx
$ sudo nginx -t
$ sudo systemctl restart nginx