Files
sam-docs/deploys/ops-manual/03-service-prod.md
권혁성 48ef98e20a docs:도메인 스왑 반영 — admin.codebridge-x.com ↔ mng.codebridge-x.com
운영: admin.codebridge-x.com → mng.codebridge-x.com
개발: mng.codebridge-x.com → admin.codebridge-x.com

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 22:40:20 +09:00

7.9 KiB

3. 운영서버 서비스 관리

목차로 돌아가기 | 서버: sam-prod (211.117.60.189)


Nginx

명령어:

sudo systemctl status nginx
sudo nginx -t                     # 설정 테스트 (반드시 reload/restart 전에 실행)
sudo systemctl reload nginx       # 설정 리로드 (무중단)
sudo systemctl restart nginx      # 재시작 (연결 끊김 발생)
sudo systemctl stop nginx
sudo systemctl start nginx

설정 파일:

파일 용도
/etc/nginx/nginx.conf 메인 설정 (worker_connections 1024, client_max_body_size 50M)
/etc/nginx/sites-available/ 사이트별 설정
/etc/nginx/sites-enabled/ 활성화된 사이트 (심링크)
/etc/nginx/snippets/security.conf 보안 규칙 (.env, .git 차단)

로그 파일:

파일 내용
/var/log/nginx/api.sam.it.kr.access.log API 접근 로그
/var/log/nginx/api.sam.it.kr.error.log API 에러 로그
/var/log/nginx/sam.it.kr.access.log 프론트엔드 접근 로그
/var/log/nginx/sam.it.kr.error.log 프론트엔드 에러 로그
/var/log/nginx/mng.codebridge-x.com.access.log Admin 접근 로그
/var/log/nginx/mng.codebridge-x.com.error.log Admin 에러 로그
/var/log/nginx/sales.codebridge-x.com.access.log Sales 접근 로그
/var/log/nginx/sales.codebridge-x.com.error.log Sales 에러 로그

주요 설정 값:

  • worker_processes: auto
  • worker_connections: 1024
  • client_max_body_size: 50M
  • keepalive_timeout: 65
  • gzip: on (text/plain, application/json, application/javascript, text/css)

PHP-FPM

명령어:

sudo systemctl status php8.4-fpm
sudo systemctl reload php8.4-fpm    # 무중단, 설정 변경 시
sudo systemctl restart php8.4-fpm
sudo systemctl stop php8.4-fpm
sudo systemctl start php8.4-fpm

Pool 설정:

Pool 설정 파일 소켓 max_children memory_limit
api /etc/php/8.4/fpm/pool.d/api.conf /run/php/php8.4-fpm-api.sock 10 128M
admin /etc/php/8.4/fpm/pool.d/admin.conf /run/php/php8.4-fpm-admin.sock 5 128M
sales /etc/php/8.4/fpm/pool.d/sales.conf /run/php/php8.4-fpm-sales.sock 3 128M
api-stage /etc/php/8.4/fpm/pool.d/api-stage.conf /run/php/php8.4-fpm-api-stage.sock 3 128M

모든 Pool 공통 설정: upload_max_filesize=50M, post_max_size=50M, display_errors=Off

로그: /var/log/php8.4-fpm.log


MySQL

명령어:

sudo systemctl status mysql
sudo systemctl restart mysql       # 주의: 연결 끊김
sudo systemctl stop mysql
sudo systemctl start mysql

# 접속
sudo mysql                          # root (auth_socket)
mysql -u hskwon                     # hskwon (auth_socket, sudo 불필요)
mysql -u codebridge -p sam          # 앱 사용자

설정 파일:

파일 용도
/etc/mysql/mysql.conf.d/sam-tuning.cnf 성능 튜닝
/etc/mysql/mysql.conf.d/mysqld.cnf 기본 설정

주요 튜닝 값:

  • innodb_buffer_pool_size: 2048M
  • innodb_log_file_size: 512M
  • innodb_flush_log_at_trx_commit: 2
  • max_connections: 100
  • slow_query_log: ON (long_query_time: 2s)

로그:

파일 내용
/var/log/mysql/slow.log 느린 쿼리 (2초 이상)
/var/log/mysql/error.log 에러 로그

데이터베이스:

DB 이름 용도
sam 메인 운영 DB
sam_stage Stage 환경 DB
sam_stat 통계 DB
codebridge Sales 레거시 DB

Redis

명령어:

sudo systemctl status redis-server
sudo systemctl restart redis-server
sudo systemctl stop redis-server
sudo systemctl start redis-server

redis-cli              # CLI 접속
redis-cli ping         # 연결 테스트 → PONG

설정 파일: /etc/redis/redis.conf

주요 설정:

  • bind: 127.0.0.1 ::1 (로컬 전용)
  • maxmemory: 512mb
  • maxmemory-policy: allkeys-lru
  • supervised: systemd

Redis CLI 유용한 명령어:

redis-cli info memory           # 메모리 사용량
redis-cli dbsize                # 키 개수
redis-cli keys '*' | head -20   # 키 확인 (운영 주의)
redis-cli ttl "키이름"           # TTL 확인
redis-cli flushall              # 전체 삭제 (주의: 세션도 삭제됨)

용도: Laravel 캐시, 세션, 큐 (QUEUE_CONNECTION=redis)


PM2 (Next.js)

명령어:

pm2 status                              # 전체 상태
pm2 reload sam-front                    # 운영 무중단 재시작 (cluster 모드)
pm2 restart sam-front-stage             # Stage 재시작
pm2 logs sam-front --lines 100          # 로그 확인
pm2 logs sam-front-stage --lines 100
pm2 monit                               # 실시간 CPU/메모리
pm2 describe sam-front                  # 상세 정보
pm2 stop all                            # 전체 정지
pm2 start all                           # 전체 시작
cd /home/webservice && pm2 start ecosystem.config.js  # 설정 파일로 시작
pm2 save                                # 현재 상태 저장 (부팅 시 자동 복구용)

설정 파일: /home/webservice/ecosystem.config.js

프로세스 목록:

프로세스명 모드 인스턴스 포트 메모리 제한 용도
sam-front cluster 2 3000 300M (max-old-space-size=256) 운영 프론트엔드
sam-front-stage fork 1 3100 200M (max-old-space-size=128) Stage 프론트엔드

로그 파일: ~/.pm2/logs/ (sam-front-out.log, sam-front-error.log 등)


Supervisor (Queue Worker)

명령어:

sudo supervisorctl status                       # 전체 상태
sudo supervisorctl restart sam-queue-worker:*    # 재시작
sudo supervisorctl stop sam-queue-worker:*       # 정지
sudo supervisorctl start sam-queue-worker:*      # 시작
sudo supervisorctl reread                        # 설정 리로드
sudo supervisorctl update

설정 파일: /etc/supervisor/conf.d/sam-queue.conf

프로세스 구성:

  • 프로그램명: sam-queue-worker
  • 프로세스 수: 2 (numprocs=2)
  • 실행 명령: php /home/webservice/api/current/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
  • 실행 사용자: www-data
  • 자동 재시작: true

로그: /home/webservice/api/shared/storage/logs/queue-worker.log


node_exporter

sudo systemctl status node_exporter
sudo systemctl restart node_exporter
curl -s localhost:9100/metrics | head -20    # 메트릭 확인

포트: 9100 (UFW에서 CI/CD 서버 IP만 허용)

역할: CPU, RAM, 디스크, 네트워크 메트릭을 CI/CD 서버의 Prometheus에 제공.


Certbot (SSL)

sudo certbot certificates                    # 인증서 목록 및 만료일
sudo systemctl status certbot.timer          # 자동 갱신 타이머
sudo certbot renew --dry-run                 # 갱신 시뮬레이션
sudo certbot renew                           # 수동 갱신
sudo certbot --nginx -d 도메인명 --email develop@codebridge-x.com   # 새 도메인 발급

자동 갱신은 systemd 타이머(certbot.timer)가 처리한다. 별도 crontab 불필요.


fail2ban

sudo systemctl status fail2ban
sudo fail2ban-client status                           # jail 목록
sudo fail2ban-client status sshd                      # SSH jail 상태 (차단 IP 목록)
sudo fail2ban-client set sshd unbanip 차단된_IP주소    # IP 차단 해제
sudo systemctl restart fail2ban

설정 파일: /etc/fail2ban/jail.local (또는 jail.d/)


UFW (방화벽)

sudo ufw status verbose         # 상태 확인 (규칙 목록)
sudo ufw status numbered        # 번호로 규칙 목록
sudo ufw allow from IP주소 to any port 포트번호   # 규칙 추가
sudo ufw delete 번호            # 규칙 삭제 (번호 기반)
sudo ufw disable                # 비활성화 (비상시만)
sudo ufw enable                 # 활성화