【Rails】 프로덕션 환경에서 자산 프리 컴파일 설정

8619 단어 nginxpuma루비Rails
자신의 메모입니다.
프로덕션 환경을 정돈한 후의 애셋 프리컴파일의 설정에 대해.

환경



루비 2.6.4
Rails 5.2.4.1
puma 3.12.4
nginx 1.12.2

오류 로그



프로덕션 환경에서 루트에 액세스하면 오류가 표시됩니다.

에러 로그는 이런 느낌입니다. (읽기 쉽도록 성형 완료)

test_app/log/production.log
 INFO -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd] Started GET "/" for 119.245.128.225 at 2020-03-09 02:40:39 +0000
 INFO -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd] Processing by PostsController#index as HTML
 INFO -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd]   Rendering posts/index.html.erb within layouts/application
DEBUG -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd]   ^[[1m^[[35m (0.5ms)^[[0m  ^[[1m^[[35mSET NAMES utf8mb4 COLLATE utf8mb4_general_ci,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483^[[0m
DEBUG -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd]   ^[[1m^[[36mPost Load (0.6ms)^[[0m  ^[[1m^[[34mSELECT `posts`.* FROM `posts`^[[0m
 INFO -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd]   Rendered posts/index.html.erb within layouts/application (39.9ms)
 INFO -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd] Completed 500 Internal Server Error in 41ms (ActiveRecord: 1.1ms)
FATAL -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd]
FATAL -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd] ActionView::Template::Error (The asset "application.css" is not present in the asset pipeline.):
FATAL -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd]      5:     <%= csrf_meta_tags %>
           [e53342b0-17fc-4146-a4d1-6d64dc3007cd]      6:     <%= csp_meta_tag %>
           [e53342b0-17fc-4146-a4d1-6d64dc3007cd]      7:
           [e53342b0-17fc-4146-a4d1-6d64dc3007cd]      8:     <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
           [e53342b0-17fc-4146-a4d1-6d64dc3007cd]      9:     <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
           [e53342b0-17fc-4146-a4d1-6d64dc3007cd]     10:   </head>
           [e53342b0-17fc-4146-a4d1-6d64dc3007cd]     11:
FATAL -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd]
FATAL -- : [e53342b0-17fc-4146-a4d1-6d64dc3007cd] app/views/layouts/application.html.erb:8:in `_app_views_layouts_application_html_erb___3755432300733913925_37575720'
 INFO -- : [8619eccb-3edb-4fa4-9a1b-70d8b0a37c37] Started GET "/" for 119.245.128.225 at 2020-03-09 02:40:45 +0000
 INFO -- : [8619eccb-3edb-4fa4-9a1b-70d8b0a37c37] Processing by PostsController#index as HTML

ActionView::Template::Error (The asset "application.css"is not present in the asset pipeline.):

요컨대, 애셋 된 "application.css"가 없다는 것 같습니다.

절차



1. 수동으로 사전 컴파일



자동으로 프리컴파일되지 않으므로 수동으로 프리컴파일해 준다.

terminal
[username@ip-10-0-11-63 test_app]$ bundle exec rails assets:precompile RAILS_ENV=production
yarn install v1.22.1
[1/4] Resolving packages...
success Already up-to-date.
Done in 0.06s.
I, [2020-03-09T02:51:40.398095 #11404]  INFO -- : Writing /var/www/test_app/public/assets/application-111ac35321e379f53529ace176fe931c952be73f7ffd688b815ec21878126685.js
I, [2020-03-09T02:51:40.398487 #11404]  INFO -- : Writing /var/www/test_app/public/assets/application-111ac35321e379f53529ace176fe931c952be73f7ffd688b815ec21878126685.js.gz
I, [2020-03-09T02:51:40.401030 #11404]  INFO -- : Writing /var/www/test_app/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css
I, [2020-03-09T02:51:40.401248 #11404]  INFO -- : Writing /var/www/test_app/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css.gz

public/assets/하하에 미리 컴파일된 에셋이 존재하는지 확인.

terminal
[username@ip-10-0-11-63 test_app]$ cd public/assets/
[username@ip-10-0-11-63 assets]$ ls
application-111ac35321e379f53529ace176fe931c952be73f7ffd688b815ec21878126685.js
application-111ac35321e379f53529ace176fe931c952be73f7ffd688b815ec21878126685.js.gz
application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css
application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css.gz
http://18.179.8.134/assets/application-111ac35321e379f53529ace176fe931c952be73f7ffd688b815ec21878126685.js

확인한 주소에 직접 액세스해 보면, 제대로 표시된다(아래 화상).


2. public 아래의 파일 공개



config/environments/production.rb
  config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

의 값이 false 의 경우, public 부하의 파일이 공개되지 않으므로, true 로 하면(자) 잘 갑니다.

하지만, 직접 true 로 하는 것은 좋지 않다고 하는 것이었으므로, 위의 변경은 그만두었습니다.
에러가 나오는 것은 ENV['RAILS_SERVE_STATIC_FILES'] 에 값이 들어 있지 않은 것이 원인이므로, 터미널로부터 변수를 건네주기로 합니다.

terminal
[username@ip-10-0-11-63 test_app]$ export RAILS_SERVE_STATIC_FILES=true

3. 서버 재부팅



코드 변경 등을 한 후에는 nginx 재부팅만으로는 반영되지 않으므로 puma도 다시 시작해야합니다.

terminal
[username@ip-10-0-11-63 test_app]$ ps ax | grep puma
14353 ?        Sl     0:00 puma 3.12.4 (unix:///var/www/test_app/tmp/sockets/puma.sock) [test_app]
14355 ?        Sl     0:00 puma: cluster worker 0: 14353 [test_app]
14356 ?        Sl     0:00 puma: cluster worker 1: 14353 [test_app]
14662 pts/1    S+     0:00 grep --color=auto puma
[username@ip-10-0-11-63 test_app]$ kill -9 14353
[username@ip-10-0-11-63 test_app]$ bundle exec puma -C config/puma/production.rb -e production -d
[username@ip-10-0-11-63 test_app]$ sudo nginx -s stop
[username@ip-10-0-11-63 test_app]$ sudo service nginx start

친구의 puma만 kill 하면 cluster worker는 사라집니다. 불안한 경우에는 다시 $ ps ax | grep puma 명령으로 확인하면 됩니다.

링크


  • 자산 파이프라인 - Rails 가이드
  • Rails Asset Pipeline이 작동하지 않을 때 문제를 분리하는 방법
  • Rails5에서 nginx+puma로 production 환경 구축
  • 자주 사용하는 자산 관련 설정 항목 정리
  • 좋은 웹페이지 즐겨찾기