서버가 갑자기 죽은 경우를 대비해 서버를 재시작하면 rails를 띄우는 방법을 찾아봤다.
처음에는 crontab을 이용했다.
@reboot su - user1 -c "cd /home/user1/helloworld && bundle exec rails s"
(user1의 계정으로 서비스 띄우기)
잘 되긴 했는데, 이것보다는 서비스를 등록해서 하는 방법이 더 일반적이라고 해서 찾아봤다.
세팅할 서버는 centos 7이었고, 여기에는 systemd를 사용해서 할 수 있다.
방법 간략히.
1. root 계정으로 /etc/systemd/system에 서비스 파일을 만든다.
2. 서비스를 등록한다.
관련 명령어는 아래와 같다.
systemctl enable helloworld.service
등록하기(이것만 해주면 된다.)
systemctl start helloworld.service
시작하기(지금 실행하고 싶을 때)
systemctl stop helloworld.service
멈추기(실행하고 있는 걸 멈추고 싶을 때)
systemctl status helloworld.service
상태 확인하기(서비스가 어떤 상태인지 확인해야할 때)
service 파일을 수정했을 때는 아래 명령어를 실행해야 한다.
systemctl daemon-reload
3. 문제가 생긴다면 아래 명령어로 로그를 확인하자.
journalctl -u helloworld
Rails 서비스를 systemd에 추가하기
결론부터 말하면 아래 파일을 /etc/systemd/system에 helloworld.service로 추가했다.
[Unit]
Description=Hello World Rails Server
After=network.target
[Service]
ExecStart=/usr/bin/bash -lc 'bundle exec rails server'
WorkingDirectory=/home/user1/helloworld
Restart=on-failure
User=user1
[Install]
WantedBy=multi-user.target
해당 작업을 하는 시기를 network.target 후로 잡았다. (이거는 구글링하면서 찾음.)
ExecStart는 실행할 명령어다. rails가 아니라 다른 명령어를 하고 싶다면 작은 따옴표 사이에 넣어주면 된다.
WorkingDirectory는 명령어를 실행할 위치다.
Restart는 서비스를 언제 띄울지 정하는 건데, on-failure라는 건 서비스가 정상종료가 아닐 때 다시 서비스를 띄운다는 뜻이다.
사실 이거때문에 좀 문제가 있었다. 서비스 배포할 때 "Address already in use (이미 사용 중인 포트입니다)"라고 떴다.
그래서 Restart 줄을 지웠다. (그러면 서버가 처음 뜰 때만 서비스를 실행한다)
User는 서비스를 실행할 사용자다.
systemd 변수는 잘 정리된 곳이 있어서 소개한다.
https://fmd1225.tistory.com/93
아래는 작업 기록
처음에는 Puma를 띄우는 방식으로 했다.
github에 puma systemd 관련 정보가 있어서 그걸 보고 따라했다.
ExecStart=/home/user1/.rbenv/shims/puma -C /home/user1/helloworld/config/puma.rb /home/user1/helloworld/config.ru
ExecStart만 위처럼 해주면 된다.
그랬더니 서버는 뜨는데 502가 떴다.
그래서 rails를 실행하도록 고쳤다. (위의 파일) 그랬더니 잘 된다.
sidekiq 실행하기
간단하다. ExecStart만 고쳐주면 된다.
[Unit]
Description=Sidekiq for Hello World
After=network.target
[Service]
ExecStart=/usr/bin/bash -lc 'bundle exec sidekiq'
WorkingDirectory=/home/user1/helloworld
Restart=on-failure
User=user1
[Install]
WantedBy=multi-user.target
pm2 이용해서 systemd 등록하기
root 계정으로 해야한다.
pm2 startup
실행하면 자동으로 서비스 파일이 만들어진다.
작업 기록
pm2 list
위 명령어로 봤을 때 서비스가 잘 떠있는데 이상하게 브라우저에서 접속이 안 된다.
알고보니 nginx가 안 떴다.
nginx를 systemd에 추가해줬더니 해결
systemctl enable nginx
'개발노트' 카테고리의 다른 글
Communications link failure 에러가 떴을 때 (feat. DataGrip) (0) | 2022.08.26 |
---|---|
ssh로 쉽고 빠르게 접속하기 (0) | 2021.01.21 |
티스토리에서 코드블록 어렵네요 ㅠㅠㅠ (0) | 2021.01.21 |
scp (0) | 2020.12.29 |
grep (0) | 2020.12.29 |
댓글