[Nginx-proxy 이미지 사용]

- docker-compose 를 통한 컨테이너 구축


- 서브도메인을 분기 시켜줄 프록시 컨테이너

* nginx-proxy.yaml


version: '2'
services:
nginx-proxy:
container_name: nginx-proxy
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /home/test/nginx-proxy/log:/var/log/nginx

networks:
default:
external:
name: nginx-proxy



- 기본 웹서버 컨테이너

* nginx-www.yaml


version: '2'
services:
nginx-www:
image: nginx:latest
environment:
- VIRTUAL_HOST=www.domain.com
container_name: nginx-www

networks:
default:
external:
name: nginx-proxy



- 서브도메인을 테스트 할 test 컨테이너 (test 대신 다른 웹서버 이미지를 사용해서 테스트 해야합니다.)

* test.yaml


version: '2'
services:
test-container:
image: test
container_name: test
environment:
- VIRTUAL_HOST=sub.domain.com
- VIRTUAL_PORT=3000

networks:
default:
external:
name: nginx-proxy



- 프록시 컨테이너 내 nginx 설정 파일 확인

/etc/nginx/conf.d/default.conf

~~~
server {
    server_name _; # This is just an invalid value which will never trigger on a real hostname.
    listen 80;
    access_log /var/log/nginx/access.log vhost;
    return 503;
version: '2'
}
# www.domain.com
upstream www.domain.com {
                ## Can be connected with "nginx-proxy" network
            # nginx-www
            server 192.0.0.1:80;
}
server {
    server_name www.domain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://www.domain.com;
    }
}
# test.domain.com
upstream test.domain.com {
            ## Can be connected with "nginx-proxy" network
            # test web server container
            server 192.0.0.2:3000;
}
server {
    server_name test.domain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://test.domain.com;
    }
}



---------------

[Webhook]

- 웹훅은 새 이벤트 (클라이언트 측 응용 프로그램이 관심을 가질 수있는)가 서버에서 발생한 경우 서버 측 응용 프로그램이 클라이언트 측 응용 프로그램에 알릴 수있는 메커니즘을 제공합니다.


- "역방향 API" 라고도 합니다 . 일반적인 API는 클라이언트가 서버를 호출합니다. 반면 웹훅의 경우 웹훅 (클라이언트에서 제공하는 URL)을 호출하는 서버 측에 등록하면 서버에서 특정 이벤트가 발생했을 때 클라이언트를 호출합니다.


* 특정한 Event가 발생하면 ➔ Trigger로 웹훅이 동작하고 -> 지정한 Action이 일어납니다


[Yona - Mattermost 를 통한 웹훅 테스트]

1. Mattermost 의 팀 설정에서 Incomming Hook 생성 (생성된 webhook url 복사)

2. 요나의 프로젝트 -> 설정 -> 웹훅 -> 새 웹훅 생성 항목에 복사한 Mattermost 웹훅 url 추가

3. 해당 프로젝트에서 이슈 생성 및 수정, 삭제 등등 작업

4. Mattermost 채널에서 봇에 의한 이슈 알림 확인

------------------------------------------------------------------------------------------------------------


1)



2)



3)



4)



---

- 리눅스에서 파일을 일반적으로 백그라운드로 실행을 하면

  터미널, 콘솔창 등의 연결 프로그램을 닫으면 세션이 종료되어

  백그라운드에서 실행되던 프로세스도 같이 종료되어 버린다.


- 해당 문제를 해결하기 위해 nohup 명령어를 사용한다.


[사용법]

$ nohup ./script.sh &

$ nohup java main.class &

$ nohup python test.py &


등등...


[출력]

* 기본 출력은 실행파일과 같은 위치에 nohup.out 이라는 파일에 저장된다.


* 출력 파일 변경은 일반적인 redirect 옵션을 사용

$ nohup python test.py > print.log &


* 출력 파일 내용이 실시간으로 생기지 않고 어느정도 내용이 쌓이면 저장되는데,

  파이썬의 경우에는 -u 옵션 사용해서 바로 확인이 가능하다.

$ nohup python -u test.py > print.log &

[Ubuntu locale 한글 변경]


- 현재 locale 확인

$ locale


- 설치

$ sudo apt-get install language-pack-ko


- 한글 추가

$ sudo locale-gen ko_KR.UTF-8


- 한글 적용

1)

$ sudo dpkg-reconfigure locales


2-1) 명령어 방법

$ sudo update-locale LANG=ko_KR.UTF-8 LC_MESSAGES=POSIX


2-2) 직접 파일 수정 방법

$ vi /etc/default/locale

LANG=ko_KR.UTF-8

LC_MESSAGES=POSIX


* 이후 ssh 재접속 및 서버 재부팅 후 확인

* 서버에서 자동화를 위해 expect 쉘스크립트를 작성하면서 겪은 문제입니다.


[스크립트 예시]


#!/bin/bash

expect << EOL
spawn telnet 192.168.0.1

expect -timeout 2 "*ogin:"
send "test\n"

expect -timeout 2 "*assword:"
send "test\n"

#expect -timeout 2 "*@TEST_SERVER"
send "exit\n"

sleep 1
expect eof

echo "hahaha"


[실행 결과]


test@TEST_SERVER> exit 


Connection closed by foreign host.

invalid command name "echo"

    while executing

"echo "hahaha""



[원인]

- 위 방식은 expect 사용방식 중 HEREDOC 사용할 경우 시작과 끝을 잘 표시해줘야 한다.

(vscode 에서는 문서 형식을 shell script 로 하면 이상함을 바로 느낄 수 있다.)


expect << EOL   # 시작

...

EOL                 # 끝


- 위 스크립트는 끝부분을 표시해 주지 않아서 expect 관련 명령어로 인식되어 오류가 발생했다.



[수정]

#!/bin/bash

expect << EOL
spawn telnet 192.168.0.1

expect -timeout 2 "*ogin:"
send "test\n"

expect -timeout 2 "*assword:"
send "test\n"

#expect -timeout 2 "*@TEST_SERVER"
send "exit\n"

sleep 1
expect eof
EOL

echo "hahaha"


test@TEST_SERVER> exit 


Connection closed by foreign host.

hahaha



- 정상적으로 expect 종료 후 echo 명령어가 실행된다.




'Programming > Server' 카테고리의 다른 글

[Linux] nohup 사용  (0) 2019.02.01
[Ubuntu] AWS - Ubuntu locale 한글 변경  (0) 2019.01.14
[CentOS 7] iptables 로그 남기기  (0) 2018.12.14
[FCM] 서버측 UnknownHostException  (0) 2018.10.01
[CentOS 7] systemd 기본 설정  (0) 2018.09.30

[Yona 란]

- 네이버에서 개발한 설치형 이슈트래커

- 팀 업무 및 회사의 업무 생산성이 높아지며 정보의 생성, 축적, 공유가 훨씬 편해짐
- 개발조직 / 비개발조직 간의 진정한 협업을 지향
- 그룹 및 프로젝트 단위로 관리 가능(사내에선 프로젝트를 팀 단위로 사용 예정)
- 각종 문서나 파일을 쉽게 공유할 수 있는 게시판 있음

[설치 방법]

* Docker 사용

* docker-compose file


version: '2'
services:
yona:
image: pokev25/yona:latest
container_name: yona
restart: always
environment:
- BEFORE_SCRIPT=before.sh
- JAVA_OPTS=-Xmx2048m -Xms1024m
volumes:
- /home/yona/data:/yona/data # 데이터를 유지할 위치 설정
ports:
- "9000:9000"

yona_db:
image: mariadb
container_name: yo_db
restart: always
volumes:
- /home/yona/mysql/data:/var/lib/mysql # 데이터를 유지할 위치 설정
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: yona
MYSQL_USER: test
MYSQL_PASSWORD: 1234
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci

# docker-compose -f docker-file.yml up -d


* 컨테이너 시작 후 오류가 발생하고 요나가 정상 실행되지 않을 수 있음. (설정이 제대로 완료되지 않은 상태)

* /home/yona/data/conf/application.conf  - 해당 파일이 생성된 것을 확인하고 수정하기

(db 연결 설정 : db_name 은 docker 를 이용해 mariadb 를 생성할 때 지정한 이름과 동일하게 입력)

~~~~

# MariaDB

db.default.driver=org.mariadb.jdbc.Driver

#db.default.url="jdbc:mariadb://192.168.0.0:3306/db_name?useServerPrepStmts=true"

db.default.url="jdbc:mariadb://192.168.0.0:3306/yona?useServerPrepStmts=true"

db.default.user=test

db.default.password="1234"

~~~~

(현재 서버 설정 확인)

application.scheme="http"

application.hostname="192.168.0.0"

application.port="9000"

~~~~

(메일 알림 기능을 사용하려면 아래 설정 수정 필요)

smtp.host = smtp.gmail.com

smtp.port = 465

smtp.ssl = true

smtp.user = "내이메일@gmail.com"

# Be careful!!! Not to leak password

smtp.password = "password"

smtp.domain = gmail.com

#true to use mock mailer for testing, false for using real mail server

smtp.mock = false

# optional, size of mail archive for tests, default: 5

smtp.archive.size = 5

~~~~

(나머지 설정은 필요 시 확인 후 수정)


* 설정 변경 후 다시 컨테이너 시작하면 정상적으로 실행됩니다.



[옵션 몇가지]

* 설정 파일 : /home/yona/data/conf/application.conf


- 가입시 관리자가 승인해야 하는 기능

# signup.require.admin.confirm = true


- 특정 도메인의 이메일만 수신을 가능하게 제한하는 기능

# application.allowed.sending.mail.domains = ""


- 최초 가입시 메일로 유효 메일 확인을 하는 기능

# application.use.email.verification = true


- 로그인 하지 않으면 어떠한 페이지도 보이지 않게 만드는 기능

application.allowsAnonymousAccess=true


--------------------------



[선행 작업]

- 마스터 서버의 mysql 에서 복제 전용 계정을 새로 만들던가 기존 계정에 복제 관련 권한을 추가해 줘야한다.

mysql> GRANT REPLICATION SLAVE ON *.* TO 'id'@'ip' IDENTIFIED BY 'password';


- 마스터, 슬레이브에서 replication 할 db 의 데이터를 맞춰둔다. (덤프 이용)

* DB 데이터 백업

# mysqldump -u계정명 -p비밀번호 db > db.sql


* 함수, 프로시저, 트리거 를 함께 백업해야 할 경우

# mysqldump --routines --trigger -u계정명 -p비밀번호 db > db.sql


* 함수, 프로시저, 트리거 만 백업해야 할 경우 (테이블 제외)

# mysqldump --routines --no-create-info --no-data --no-create-db --skip-opt db > db_no_tables.sql


* 백업 데이터 복원

# mysql -u계정명 -p비밀번호 db < db.sql




[설정]

1) 마스터 설정파일 수정

/etc/my.cnf.d/server.cnf

----

[mysqld]

log-bin=mysql-bin

server-id=1

----

위 항목 추가


2) 마스터 mysql 실행 & 마스터 설정 확인

# service mysql start

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 |      906 |              |                  |

+------------------+----------+--------------+------------------+

* file, position 기록해놓기.


3) 슬레이브 설정파일 수정

/etc/my.cnf.d/server.cnf

----

[mysqld]

server-id=2

# replicate-do-db='repl' 

# 위 설정을 통해 하나의 db 만 replication 가능. 없으면 모든 db 를 replication 함.

# 몇몇개의 db 만 replication 할 경우 replicate-do-db 항목을 여러개 추가

----

위 항목 추가


4) 슬레이브 mysql 실행 & 슬레이브 마스터 연결 설정

# service mysql start

mysql> change master to

master_host='192.168.0.1',

master_user='id',

master_password='password',

master_log_file='mysql-bin.000001',   # 마스터 설정에서 확인한 file 이름

master_log_pos=906;                   # 마스터 설정에서 확인한 position 번호


5) 슬레이브 replication start

mysql> start slave;



[참고 링크]

http://we-minarida.tistory.com/entry/%EC%8B%A4%EC%82%AC%EC%9A%A9-db-%EC%97%90%EC%84%9C-mysql-replication

http://server-talk.tistory.com/241

https://blurblah.net/1490


[오류 발생]


The user specified as a definer ('user'@'ip') does not exist different ip address


- 해당 오류는 계정 정보의 불일치로 여러가지 경우에 발생하며 일반적인 경우에는 권한 추가 등과 같은

  널리 알려진 방법으로 해결 가능하다



[원인]


- 업무상의 이유로 서버가 변경되면서 IP 도 바뀌게 됨.

- 서버 변경 후 procedure 의 definer (정의자) 변경을 하지 않아서 발생함


(Heidisql 사용)


정의자를 알맞는 계정으로 수정하면 됨.


'Programming > DB' 카테고리의 다른 글

[Mysql & MariaDB] Master Slave Replication 설정  (0) 2019.01.03
[Mysql & MariaDB] 백업 & 복원  (0) 2018.10.04
[MariaDB] Clustering  (0) 2018.09.18
[MariaDB] Character Set 변경  (0) 2018.09.17

* Jupyter Lab : Jupyter Notebook 을 좀 더 개선한 버전

* 아래 설치, 실행, 원격접속 방법은 Jupyter Notebook, Jupyter Lab 둘 모두 동일합니다.

* 기본 환경

 - Anaconda3

 - Python3.5



[설치]

- Jupyter Lab

(anaconda)$ conda install jupyterlab


- Jupyter Notebook

(anaconda)$ conda install jupyter



[실행]

- Jupyter Lab

(anaconda)$ jupyter lab


- Jupyter Notebook

(anaconda)$ jupyter notebook



[원격 접속을 위한 설정]

- Jupyter Lab

(anaconda)$ jupyter lab --generate-config

(anaconda)$ jupyter lab password


- Jupyter Notebook

(anaconda)$ jupyter notebook --generate-config

(anaconda)$ jupyter notebook password



각각 $HOME/.jupyter/ 위치에 jupyter_notebook_config.json, jupyter_notebook_config.py 파일이 생성됩니다.

json 파일에는 암호화된 비밀번호가 입력되어있고 해당 암호를 복사하여

jupyter_notebook_config.py 파일의 c.NotebookApp.password 항목에 입력합니다.


* $HOME/.jupyter/jupyter_notebook_config.json

* $HOME/.jupyter/jupyter_notebook_config.py


[jupyter_notebook_config.py]

c.NotebookApp.password = 'sha1:*********'    # 외부 접속시 사용할 비밀번호

c.NotebookApp.ip = '*'                              # 어디서든 접속 가능

c.NotebookApp.port = 8888                       # 접속에 사용할 포트



[비밀번호 설정 다른 방법]

파이썬을 실행해서 코드를 통해 비밀번호를 얻을 수 있습니다.


(anaconda)$ python

>> from notebook.auth import passwd

>> passwd()

>> Enter password: 

>> Verify password: 

'sha1:********'


출력되는 sha1 암호문자열을 복사해서 사용하시면 됩니다.



* 참고 링크

https://unix.stackexchange.com/questions/423778/log-iptables-events-on-centos-7

http://flowvalue.tistory.com/2



[rsyslog 수정 (root)]

# vi /etc/rsyslog.conf


// add rule

...

#### RULES ####

...

kern.* /var/log/iptables.log 



[rsyslog 재시작 (root)]

# service rsyslog restart  

or  

# systemctl restart rsyslog



[iptables 수정 (root)]

# vi /etc/sysconfig/iptables


*filter

...

*nat

...

-A PREROUTING ~~~

-A INPUT ~~~

-A OUTPUT ~~~

...

-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " 

COMMIT



[iptables 재시작 (root)]

# systemctl restart iptables


log level - warn

iptables -A INPUT -j LOG --log-prefix "BAD_INPUT: " --log-level 4

iptables -A FORWARD -j LOG --log-prefix "BAD_FORWARD: " --log-level 4

iptables -A OUTPUT -j LOG --log-prefix "BAD_OUTPUT: " --log-level 4


log level - debug

iptables -A INPUT -j LOG --log-prefix "BAD_INPUT: " --log-level 7

iptables -A FORWARD -j LOG --log-prefix "BAD_FORWARD: " --log-level 7

iptables -A OUTPUT -j LOG --log-prefix "BAD_OUTPUT: " --log-level 7



+ Recent posts