innodb_force_recovery

Posted by 크롱_k
2017.08.02 16:01 서버/리눅스 이야기
각 설정값별 복구 내용과 방식을 간단히 살펴보자. 

·         1 ( SRV_FORCE_IGNORE_CORRUPT )
데이터 파일의 손상된 페이지가 발견되어도 무시하고 MySQL을 기동시킨다.  일단 MySQL이 기동되면, SELECT * FROM tbl_name; 명령문을 실행하여 데이터를 덤프하여 다시 적재하거나 다른 데이터베이스로 이전하는 것이 좋다이 때손상된 인덱스 레코드와 페이지는 모두 건너뛰게 된다. (무시해 버리므로 데이터를 잃게 된다.)
에러 로그 파일에 "Database page corruption on disk or a failed "라고 출력되는 경우대부분 이 케이스인데 이는 테이블 스페이스의 페이지가 손상되어서 발생하는 문제이다이 경우에는 이 모드로 MySQL의 기동 후, mysqldump SELECT INTO OUTFILE...을 이용하여 덤프 및 재 적재가 가능하다.

·         2 ( SRV_FORCE_NO_BACKGROUND )
InnoDB의 여러 가지 Background thread들 중에서 Main thread를 시작하지 않고 MySQL을 기동시킨다. InnoDB의 경우 트랜잭션과 동시성 향상(MVCC)을 위해서 Undo 정보를 보존하게 되는데 Undo 정보는 변경되기 전 데이터를 가지게 된다이러한 Undo 정보는 여러 가지 상황에 맞춰서 적절한 시점에 삭제가 되어야 하는데 이 작업을 Main thread가 처리한다 (이 작업을 Purge라고도 부른다.). 그런데 만약 MySQL 의 시작 과정에서 InnoDB가 이러한 Purge 작업 중 오류를 발생시킨다면, MySQL의 기동 시에 Main thread를 시작시키지 않기 때문에 Purge 작업 중의 오류를 피할 수 있게 되므로일단 MySQL을 시작시킬 수는 있게 된다. Undo 정보는 InnoDB의 시스템 테이블 스페이스에 관리되기 때문에이 경우에는 전체 데이터베이스를 덤프 받은 후 다시 MySQL 서버를 구성해야 한다.

·         3 ( SRV_FORCE_NO_TRX_UNDO )
MySQL을 종료하던 시점에 만약 진행 중인 트랜잭션이 있었다면, MySQL은 그냥 단순히 그 Connection을 강제로 끊어 버리게 된다그 이후 별도의 정리 작업은 진행하지 않게 된다 MySQL은 종료되었지만진행 중이던 트랜잭션의 정리 작업은 하지 않게 되는 것이다. MySQL이 다시 시작하게 되면, InnoDB 엔진은 트랜잭션 로그(Redo log라고도 함)를 읽어서 다시 처리 해주고(이 작업을  Roll forward라고 함), 최종적으로 어떤 트랜잭션이 완료되지 않고 Connection이 종료되었는지 판단 후그 트랜잭션들은 InnoDB 엔진이Rollback을 시키게 되는데만약 Undo 영역이나 다른 관련된 데이터들이 손상된 경우에는 Rollback 처리를 해줄 수 없게 되는데이 경우에 사용하는 복구 모드이다. 이 경우에는 사실은 Rollback되어야 하지만실제 데이터 파일에는 그 데이터가 남아 있을 수 있다. (이 부분은 Binary log Application의 로그를 통해서 수동으로 보완해 주거나 무시하는 방법밖에 없다.)

·         4 ( SRV_FORCE_NO_IBUF_MERGE )
MySQL InnoDB는 INSERT, UPDATE, DELETE 등의 데이터 변경 작업으로 발생하는 인덱스 변경 작업들을 상황에 따라서 즉시 실행할 수도 또는 나중에 처리하도록 지연시킬 수 도 있다이렇게 나중에 처리하도록 지연시키기 위해서는 변경 내용을 어딘가에 기록해 두어야 하는데그 용도로 사용되는 버퍼가 "Insert Buffer"이다 Insert Buffer의 내용은 언제 데이터 파일에 병합(Merge)될지 알 수 없다. MySQL을 종료해도 병합되지 않을 수 있는데만약 MySQL이 재 시작 되면서 Insert Buffer의 손상을 감지하게 되면 Insert Buffer의 병합 작업이 실패하고 MySQL이 기동하지 못하게 된다이 경우 사용할 수 있는 강제 복구 모드이다. (이 경우에는 테이블 통계 정보 갱신을 유발하는 작업들을 해서는 안 된다주로 DDL이나 ANALYZE 명령 등). Insert Buffer는 실제 데이터와 관련된 부분이 아니라 인덱스에 관련된 부분이라 테이블을 덤프 후 다시 적재하면 처리될 수도 있고아니면 단순히 "ALTER TABLE tbl_name ENGINE=InnoDB;" 명령만으로 해결될 수도 있다.

·         5 ( SRV_FORCE_NO_UNDO_LOG_SCAN )
복구 모드 3 ( SRV_FORCE_NO_TRX_UNDO )의 처리와 비슷하며이 모드에서는 Undo 로그를 완전히 무시하고 완전히 종료되지 않은 트랜잭션(COMMIT/ROLLBACK되지 않은)을 모두 COMMIT된 것으로 처리해 버린다.  또한 이 모드에서는 Undo 로그를 전혀 참조하지 않는 형태로 강제 복구 시킨다.

·         6 ( SRV_FORCE_NO_LOG_REDO )
이것은 MySQL 서버가 재 시작되기 전 가장 뒤에 발생한 체크 포인트 이후의 모든 트랜잭션을 버리고 복구 시키는 모드이다당연히Redo 로그를 참조하지 않으므로 Roll forward라는 작업도 하지 않고 강제 복구시키게 된다. Redo 로그가 손상된 경우 이 모드로 강제 복구가 가능하다.

여기서 설명된 강제 복구 모드는 그 설정 값이 높아질수록 손실되는 데이터가 많아지기(복구 가능한 데이터가 적어지기때문에가능한 강제 복구 모드를 낮은 것(1 -> 2 -> 3 -> 4 -> 5 -> 6)부터 시도해 볼 것을 추천한다.

아래 내용은 HighPerformanceMySQL 블로그에서 발췌한 내용을 번역한 것인데같이 참조하면 좋을 듯 하다.
InnoDB 테이블이 손상되는 경우는 상당히 희박
Double write, Checksum 그리고 기타 Validation 로직들과 버그 보완으로 인해서실제로 MyISAM에 비해서 InnoDB 테이블 스페이스 및 데이터 파일은 상당히 안정적이다.

대부분의 손상은 인덱스에서 발생
많은 사람들이 경험하는 InnoDB 데이터 파일의 손상은 80~90% 정도가 InnoDB 인덱스 (Secondary index)에 발생한 손상인 경우이며이 경우에는 단순히 ALTER TABLE 또는 데이터 덤프 및 재 적재만으로 해결된다복구 모드 "1 ( SRV_FORCE_IGNORE_CORRUPT )" 참조.

이 이외의 InnoDB 테이블의 문제점들의 경우는 덤프 및 적재
이 이외의 복잡한 형태의 장애에 대해서는, (아주 심한 경우가 아니라면)데이터베이스 전체를 덤프하고 다시 적재하는 것으로 해결될 수 있다하지만가장 최근의 백업에 Binary log Replay (재 실행)해주는 것보다 빠를지는 상황을 적절히 판단해서 결정하는 것이 좋을 듯 하다.


이래도 저래도 안 되는 경우에는(대표적으로 InnoDB의 시스템 테이블 스페이스가 손상된 경우아래 URL의 도구를 참조하는 것도 도움이 될 수 있을 듯 하다.
(사용해 본 경험이 없어서얼마나 작동할지는 잘 모르겠다.)


신고

'서버 > 리눅스 이야기' 카테고리의 다른 글

innodb_force_recovery  (0) 2017.08.02
vi 공백 지우기  (0) 2017.01.06
linux 메모리 슬롯확인  (0) 2016.11.16
vpopmail dovecot qmail 연동  (0) 2016.10.28
SSD health check  (0) 2016.08.30
mysql 5.7 사용자 계정  (0) 2016.08.24
이 댓글을 비밀 댓글로

vi 공백 지우기

Posted by 크롱_k
2017.01.06 16:06 서버/리눅스 이야기

sed -i -e 's/\r$//' test.sh

신고

'서버 > 리눅스 이야기' 카테고리의 다른 글

innodb_force_recovery  (0) 2017.08.02
vi 공백 지우기  (0) 2017.01.06
linux 메모리 슬롯확인  (0) 2016.11.16
vpopmail dovecot qmail 연동  (0) 2016.10.28
SSD health check  (0) 2016.08.30
mysql 5.7 사용자 계정  (0) 2016.08.24
이 댓글을 비밀 댓글로

linux 메모리 슬롯확인

Posted by 크롱_k
2016.11.16 10:58 서버/리눅스 이야기

dmidecode -t 17 | egrep 'Memory|Size'

신고

'서버 > 리눅스 이야기' 카테고리의 다른 글

innodb_force_recovery  (0) 2017.08.02
vi 공백 지우기  (0) 2017.01.06
linux 메모리 슬롯확인  (0) 2016.11.16
vpopmail dovecot qmail 연동  (0) 2016.10.28
SSD health check  (0) 2016.08.30
mysql 5.7 사용자 계정  (0) 2016.08.24
이 댓글을 비밀 댓글로

vpopmail dovecot qmail 연동

Posted by 크롱_k
2016.10.28 14:08 서버/리눅스 이야기
https://hetzer7.wordpress.com/category/vpopmail/ << 원본

최근 dovecot이 v2.0으로 메이저 업데이트 되었네요.
기존에 1.x을 사용해오던 저로서는 당황스러웠지만, 시대의 흐름을 따라(?) 2.0의 변화를 알아보고자 컴파일부터, 설정, 실행까지 다시 해보았습니다. (대폭 바뀌었군요 ㅡㅡ;;)
(dovecot 2.0 설정부분은 제가 작성한 영문판 qmail-1.03에서(http://notes.sagredo.eu/node/28)의 지문을 참조했습니다. 설치후 문제가 발생할시 참조하시면 유익합니다.

1. Dovecot 2.0.16 설치
우선 홈페이지에서 v2.0.16 소스를 다운로드한다. 
 
#wget http://www.dovecot.org/releases/2.0/dovecot-2.0.16.tar.gz
#tar zxf dovecot-2.0.16.tar.gz

#cd dovecot-2.0.16

#./configure –with-vpopmail (본인은 qmail + vpopmail 조합을 사용중)

#make

#make install

dovecot 계정을 생성한다.
#useradd -d / -s /sbin/nologin dovecot
#useradd -d /null -s /sbin/nologin dovenull 
로그파일을 생성한다.
#touch /var/log/dovecot/dovecot.log
#chgrp vchkpw /var/log/dovecot/dovecot.log
#chmod 660 /var/log/dovecot/dovecot.log
 
#vi /usr/local/etc/dovecot/conf.d/10-logging.conf
log_path = /var/log/dovecot/dovecot.log
plugin {
}
 
  
설치후 실행에 필요한 샘플 config파일들을 실제 폴더로 옮겨놓는다. 
 #cp -r /var/tmp/dovecot-2.0.16/doc/example-config/* /usr/local/etc/dovecot/
#vi /usr/local/etc/dovecot/dovecont.conf
 
protocols = imap #본인은 imap만을 사용listen = *, ::
login_greeting = Dovecot ready.

#vi /usr/local/etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = no
auth_mechanisms = plain
#!include auth-system.conf.ext (주석처리)
..
..
!include auth-vpopmail.conf.ext (vpopmail 사용시)


#vi /usr/local/etc/dovecot/conf.d/10-mail.conf
설정하기전 
#id -u vpopmail 
#id -g vpopmail 
vpopmail의 uid값과 gid값을 미리 조회하여 메모

mail_location = maildir:%h/Maildir

mail_uid = 213
mail_gid = 497

mail_privileged_group = 497
mail_access_groups = 497

first_valid_uid = 213
last_valid_uid = 213

first_valid_gid = 497
last_valid_gid = 497
auth_socket_path = /var/run/dovecot/auth-userdb


# vi /usr/local/etc/dovecot/conf.d/10-master.conf

default_login_user = vpopmail

default_internal_user = vpopmail

service imap-login {
  inet_listener imap {
  # port = 143
  }
  inet_listener imaps {
   # port = 993
   # ssl = yes
  }

}
service pop3-login {
  inet_listener pop3 {
   # port = 110
  }
  inet_listener pop3s {
   # port = 995
   # ssl = yes
  }
}

service lmtp {
  unix_listener lmtp {
    #mode = 0666
  }

  # Create inet listener only if you can’t use the above UNIX socket
  #inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    #address =
    #port =
  #}
}

service imap {
  # Most of the memory goes to mmap()ing files. You may need to increase this
  # limit if you have huge mailboxes.
  #vsz_limit = 256M

  # Max. number of IMAP processes (connections)
  #process_limit = 1024
}

service pop3 {
  # Max. number of POP3 processes (connections)
  #process_limit = 1024
}

service auth {
  # auth_socket_path points to this userdb socket by default. It’s typically
  # used by dovecot-lda, doveadm, possibly imap process, etc. Its default
  # permissions make it readable only by root, but you may need to relax these
  # permissions. Users that have access to this socket are able to get a list
  # of all usernames and get results of everyone’s userdb lookups.
  unix_listener auth-userdb {
    mode = 0600
    user = vpopmail
    group = vchkpw
  }

  # Postfix smtp-auth
  #unix_listener /var/spool/postfix/private/auth {
  #  mode = 0666
  #}

  # Auth process is run as this user.
  user = $default_internal_user
}


service auth-worker {
  # Auth worker process is run as root by default, so that it can access
  # /etc/shadow. If this isn’t necessary, the user should be changed to
  # $default_internal_user.
  user = $default_internal_user
}

service dict {
  # If dict proxy is used, mail processes should have access to its socket.
  # For example: mode=0660, group=vmail and global mail_access_groups=vmail
  unix_listener dict {
    #mode = 0600
    #user =
    #group =
  }
}


# vi /usr/local/etc/dovecot/conf.d/10-ssl.conf

ssl = no
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
이후 /var/tmp/dovecot-2.0.16/doc에 있는 mkcert.sh를 실행해서 ssl private 인증서를 만들어 줍니다.

# vi /usr/local/etc/dovecot/conf.d/auth-vpopmail.conf.ext

passdb {
  driver = vpopmail

  # [cache_key=] [webmail=]
  #args =
}

userdb {
  driver = vpopmail

  # [quota_template=] – %q expands to Maildir++ quota
  args = quota_template=quota_rule=*:backend=%q
}
 


    이정도면 설정이 마무리 되었습니다
    dovecot을 재기동하여 telnet으로 imap에 접속해 보거나 roundcubemail의 installer 화면에서 imap 로그인 테스트로 확인해 보시기 바랍니다.


    # telnet [your-IP] 143

    Trying [your-IP]…
    Connected to [your-IP].
    Escape character is ‘^]’.
    * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN AUTH=DIGEST-MD5 AUTH=CRAM-MD5] Dovecot ready.
    a login test@yourdomain.net [PASSWORD]
    a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS QUOTA] Logged in
    a select inbox
    * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
    * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
    * 0 EXISTS
    * 0 RECENT
    * OK [UIDVALIDITY 1287576448] UIDs valid
    * OK [UIDNEXT 1] Predicted next UID
    * OK [HIGHESTMODSEQ 1] Highest
    a OK [READ-WRITE] Select completed.
    a list “” *
    * LIST (\HasNoChildren) “.” “INBOX”
    a OK List completed.
    a logout
    * BYE Logging out
    a OK Logout completed.
    Connection closed by foreign host.
    만약 설정후 에러가 발생하게 되면 debuger모드로 해두시고 log파일을 찬찬히 살펴보면서 트러블슈팅하시면 됩니다


    신고

    '서버 > 리눅스 이야기' 카테고리의 다른 글

    vi 공백 지우기  (0) 2017.01.06
    linux 메모리 슬롯확인  (0) 2016.11.16
    vpopmail dovecot qmail 연동  (0) 2016.10.28
    SSD health check  (0) 2016.08.30
    mysql 5.7 사용자 계정  (0) 2016.08.24
    1819 : Your password does not satisfy the current policy requirements  (0) 2016.08.24
    이 댓글을 비밀 댓글로

    SSD health check

    Posted by 크롱_k
    2016.08.30 15:45 서버/리눅스 이야기



    # smartctl -a /dev/sda | egrep 'ID#|Media_Wearout_Indicator|Remaining_Lifetime_Perc|Wear_Leveling_Count'

    ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE

    233 Media_Wearout_Indicator 0x0032   100   100   ---    Old_age   Always       -       6103

    - Value 값이 100이면 100% 상태임 낮으면 낮을수록 위험 0이 되는 순간 익식 불가

     



    # smartctl -H /dev/sda

    smartctl 5.43 2012-06-30 r3573 [x86_64-linux-2.6.32-431.el6.x86_64] (local build)

    Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net


    === START OF READ SMART DATA SECTION ===

    SMART overall-health self-assessment test result: PASSED

    - PASSED 면 정상


    신고

    '서버 > 리눅스 이야기' 카테고리의 다른 글

    linux 메모리 슬롯확인  (0) 2016.11.16
    vpopmail dovecot qmail 연동  (0) 2016.10.28
    SSD health check  (0) 2016.08.30
    mysql 5.7 사용자 계정  (0) 2016.08.24
    1819 : Your password does not satisfy the current policy requirements  (0) 2016.08.24
    nginx 설치 ( CentOS 6 )  (0) 2016.07.19
    이 댓글을 비밀 댓글로

    mysql 5.7 사용자 계정

    Posted by 크롱_k
    2016.08.24 15:31 서버/리눅스 이야기

    5.7부터 user 테이블에 password필드가 사라짐 authentication_string로 변경됨 아래와 같이 변경하면됨.


    update user set authentication_string=password('패스워드') where user='root';

    신고

    '서버 > 리눅스 이야기' 카테고리의 다른 글

    vpopmail dovecot qmail 연동  (0) 2016.10.28
    SSD health check  (0) 2016.08.30
    mysql 5.7 사용자 계정  (0) 2016.08.24
    1819 : Your password does not satisfy the current policy requirements  (0) 2016.08.24
    nginx 설치 ( CentOS 6 )  (0) 2016.07.19
    Centos 7 싱글모드  (0) 2016.05.23
    이 댓글을 비밀 댓글로

    1819 : Your password does not satisfy the current policy requirements

    Posted by 크롱_k
    2016.08.24 15:29 서버/리눅스 이야기

    mysql 5.6 이상의 경우 패스워드의 복잡성을 만족해야함.


    만일 사용하지 않고자 한다면 아래와 같이 cnf에 넣을것.


    plugin-load                     = validate_password.so

    validate-password               = FORCE_PLUS_PERMANENT

    validate-password-policy        = MEDIUM

    validate-password-mixed-case-count = 0



    신고
    이 댓글을 비밀 댓글로

    nginx 설치 ( CentOS 6 )

    Posted by 크롱_k
    2016.07.19 11:18 서버/리눅스 이야기

    Http 서비스를 하기 위한 데몬중 Nginx에 설치에 대한 설명 이다.

     

    CentOS 6 에서 진행 했으며, nginx 1.11.2 버전 이다.

     

    Nginx 설치


     

     

    1. 필수 라이브러리 설치

    yum -y install gcc* make libtool-ltdl-devel openssl-devel pcre-devel ncurses-devel

    yum -y install libxml2-devel bzip2-devel curl-devel gdbm-devel libjpeg-devel libpng-devel 

    yum -y install freetype-devel imap-devel libc-client-devel krb5-devel libmcrypt 

    yum -y install libmcrypt-devel libmhash-devel flex icu libicu libicu-devel gd gd-devel libxslt libxslt-devel

     

    2. 설치 파일 다운로드

    • 하위 내용을 순차적으로 진행 한다.

     

    # cd /usr/local/src

    # wget http://nginx.org/download/nginx-1.11.2.tar.gz

    # tar zxvf nginx-1.11.2.tar.gz

    # cd nginx-1.11.2

    # ./configure --prefix=/usr/local/nginx \
    --conf-path=/usr/local/nginx/conf/nginx.conf \
    --sbin-path=/usr/local/nginx/sbin/nginx \
    --lock-path=/usr/local/nginx/nginx.lock \
    --pid-path=/usr/local/nginx/nginx.pid \
    --http-client-body-temp-path=/usr/local/nginx/tmp/body \
    --http-proxy-temp-path=/usr/local/nginx/tmp/proxy \
    --http-fastcgi-temp-path=/usr/local/nginx/tmp/fastcgi \
    --http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi \
    --http-scgi-temp-path=/usr/local/nginx/tmp/scgi \
    --http-log-path=/usr/local/nginx/logs/access.log \
    --error-log-path=/usr/local/nginx/logs/error.log \
    --with-http_addition_module \
    --with-http_degradation_module \
    --with-http_flv_module \
    --with-http_gzip_static_module \
    --with-http_image_filter_module \
    --with-http_mp4_module \
    --with-http_random_index_module \
    --with-http_ssl_module \
    --with-http_stub_status_module \
    --with-http_sub_module \
    --with-http_realip_module \
    --with-http_xslt_module \
    --with-http_dav_module \
    --with-http_auth_request_module \
    --user=nobody \
    --group=nobod

     


    # make && make install 

     

     3. Nginx start script 작성


    # vi /etc/init.d/nginx


    #!/bin/sh
    #
    # nginx - this script starts and stops the nginx daemon
    #
    # chkconfig: - 85 15
    # description: NGINX is an HTTP(S) server, HTTP(S) reverse \
    # proxy and IMAP/POP3 proxy server
    # processname: nginx
    # config: /etc/nginx/nginx.conf
    # config: /etc/sysconfig/nginx
    # pidfile: /var/run/nginx.pid

    # Source function library.
    . /etc/rc.d/init.d/functions

    # Source networking configuration.
    . /etc/sysconfig/network

    # Check that networking is up.
    [ "$NETWORKING" = "no" ] && exit 0

    #nginx="/usr/sbin/nginx"
    nginx="/usr/local/nginx/sbin/nginx"
    prog=$(basename $nginx)

    #NGINX_CONF_FILE="/etc/nginx/nginx.conf"
    NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

    [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

    lockfile=/var/lock/subsys/nginx

    make_dirs() {
    # make required directories
    user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
    if [ -z "`grep $user /etc/passwd`" ]; then
    useradd -M -s /bin/nologin $user
    fi
    options=`$nginx -V 2>&1 | grep 'configure arguments:'`
    for opt in $options; do
    if [ `echo $opt | grep '.*-temp-path'` ]; then
    value=`echo $opt | cut -d "=" -f 2`
    if [ ! -d "$value" ]; then
    # echo "creating" $value
    mkdir -p $value && chown -R $user $value
    fi
    fi
    done
    }

    start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
    }

    stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
    }

    restart() {
    configtest || return $?
    stop
    sleep 1
    start
    }

    reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
    }

    force_reload() {
    restart
    }

    configtest() {
    $nginx -t -c $NGINX_CONF_FILE
    }

    rh_status() {
    status $prog
    }

    rh_status_q() {
    rh_status >/dev/null 2>&1
    }

    case "$1" in
    start)
    rh_status_q && exit 0
    $1
    ;;
    stop)
    rh_status_q || exit 0
    $1
    ;;
    restart|configtest)
    $1
    ;;
    reload)
    rh_status_q || exit 7
    $1
    ;;
    force-reload)
    force_reload
    ;;
    status)
    rh_status
    ;;
    condrestart|try-restart)
    rh_status_q || exit 0
    ;;
    *)
    echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
    exit 2
    esac


    # chmod 700 /etc/init.d/nginx   //  실행 권한을 준다.

    # /etc/init.d/nginx start              //  nginx를 실행한다.



     

    신고
    이 댓글을 비밀 댓글로