콘텐츠로 건너뛰기
  • 커뮤니티 공지사항을 소개합니다.

    1 토픽
    1 게시물
    askfrontA

    아직 준비 중인 포럼입니다. 그럼에도 불구하고 여러분의 참여에 감사드립니다.

    이 포럼은 누구나 자유롭게 질문하고 답변할 수 있는 공간입니다. 다만, 이용약관과 함께 아래 사항을 준수해 주시길 부탁드립니다:

    1. 검색엔진에 검색 답변 금지 많은 분들이 이미 정보가 아닌, 오래된 데이터로 인해 어려움을 겪고 있습니다. 또한, 처음 접하는 분들은 낯선 것은 어렵게 느껴지기도 하고, 어떤 것을 질문해야 할지 모르는 경우가 많습니다.
    따라서 용기를 내어 질문한 분들을 격려하고자 합니다.

    저는 모든 분들이 충분한 지식을 가지고 있다고 믿으며, 충분히 합리적으로 검색을 이미 시도했을 것으로 가정합니다.
    또한 눈치채지 못한 부분도 질문하는 과정에서 알게될 수 있고, 답답한 마음에 생각나지 않는 경우도 많습니다.

    이에 따라 검색을 권장하는 답변은 자제해 주시기 바랍니다.

    2. 적극적으로 외부의 링크 혹은 자료를 사용 본 포럼은 순전히 관리자의 편의를 위해, 마크다운을 지원하는 CMS로 선택했습니다. 아무리 온몸 비틀기를 해봐야, 가장 편한게 마크다운인 것 처럼 느껴졌습니다.
    (또한 유연하게 참조를 설정하고, 사용자를 언급할 수 있으며, 병합할 수 있는 등 Github와 많이 유사합니다.) 관리자도 자기 마음대로 하는데, 사용자도 자기 마음대로 할 수 있어야지요 :) 외부 링크를 걸어도 되는지 물어보지 않으셔도 됩니다.
    본 포럼은 모든 상황에서 유연하게 대처할 수도 없고, 하고 싶지도 않습니다.
    따라서 이용자 분들이, 더 편한 방법이 있다면 물어보지 마시고 바로 사용하세요.

    설명하기 위한 Github, Gist 전부 환영입니다. 외부 이미지 링크 전부 환영입니다.
    다만 너무나 당연하지만, 저작권과 관련된 사항은 반드시 준수해야 합니다.

    고맙습니다.

  • 서버뿐만 아니라 무엇이든 이야기할 수 있는 공간입니다.

    18 토픽
    58 게시물
    navystackN

    @busker 맞습니다.
    미션크리티컬 하게 가용성이 중요한게 아니라면, 정상종료가 중요합니다.

  • 도커에 관한 자유로운 공간입니다.

    8 토픽
    28 게시물
    hojin0716H

    @navystack 조언 감사합니다 ㅎㅎ
    그래도 크게 문제 없었다는게 정말 다행이네요

  • 리눅스에 관한 자유로운 공간입니다.

    2 토픽
    5 게시물
    navystackN

    @busker Ramdisk 자체는 그렇지만, Wget으로 긁어주는 것은, 캐시를 생성해 주기 위함입니다.
    PHP를 사용하는 경우, FastCGI등을 사용하거등요 :)

    일반 CDN을 사용할 때도 캐시를 생성해 줄만 합니다.
    1순위도 캐시 2순위도 캐시입니다 :)

  • 2 토픽
    2 게시물
    navystackN

    Nodebb 성능 최적화를 위한 빠른 요약

    Nginx는 정적 파일을 직접 제공하고, 동적 요청은 Node.js 서버로 프록시

    location /socket.io/ { proxy_pass http://nodes; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; add_header pushed "wss"; } location @nodebb { proxy_pass http://nodes; } location ~ ^/assets/(.*) { root /usr/src/app/; try_files /build/public/$1 /public/$1 @nodebb; add_header pushed "assets"; add_header Cache-Control "max-age=86400"; # 1 day } location /plugins/ { root /usr/src/app/build/public; add_header pushed "plugins"; try_files $uri @nodebb; add_header Cache-Control "max-age=86400"; # 1 day } location / { proxy_pass http://nodes; add_header pushed "main"; } nginx: container_name: nginx-nodebb image: nginx:latest logging: driver: json-file options: tag: '{{.ImageName}}|{{.Name}}|{{.ImageFullID}}|{{.FullID}}' max-size: '10m' max-file: 100 restart: unless-stopped volumes: - nodebb-build:/usr/src/app/build:ro - nodebb-uploads:/usr/src/app/public/uploads:ro - nodebb-modules:/usr/src/app/node_modules:ro - ./nginx:/etc/nginx/conf.d/ networks: - internal - traefik-network depends_on: - nodebb

    default.conf

    upstream nodes { ip_hash; server nodebb-askfront:4567; keepalive 32; } server { listen 80; server_name _; set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; real_ip_recursive on; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto https; proxy_set_header Content-Disposition "attachment"; proxy_redirect off; proxy_http_version 1.1; proxy_hide_header X-Powered-By; proxy_hide_header X-Dns-Prefetch-Control; proxy_hide_header X-Download-Options; location /socket.io/ { proxy_pass http://nodes; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; add_header pushed "wss"; } location @nodebb { proxy_pass http://nodes; } location ~ ^/assets/(.*) { root /usr/src/app/; try_files /build/public/$1 /public/$1 @nodebb; add_header pushed "assets"; add_header Cache-Control "max-age=86400"; # 1 day } location /plugins/ { root /usr/src/app/build/public; add_header pushed "plugins"; try_files $uri @nodebb; add_header Cache-Control "max-age=86400"; # 1 day } location / { proxy_pass http://nodes; add_header pushed "main"; } }

    upstream nodes: Node.js 서버의 업스트림을 정의.
    ip_hash는 세션 퍼시스턴스를 제공하기 위해 클라이언트 IP를 기반으로 한 서버로 트래픽을 라우팅

    server: HTTP 서버 블록을 정의. 포트 80에서 리스닝하며, 모든 도메인을 허용.
    (상황에 맞게 적절하게 수정)

    proxy_set_header: 프록시로 전달되는 요청 헤더를 설정. 실제 IP 주소와 포트, 프로토콜 등을 설정.

    proxy_hide_header: 프록시 응답에서 특정 헤더를 숨김.

    proxy_redirect: 프록시 리디렉션을 비활성화.

    gzip 및 brotli: Gzip 및 Brotli 압축을 사용하여 지정된 MIME 타입의 응답을 압축합니다. (nodebb 자체가 요청 횟수가 많으므로 최대한 적정한 크기만 압축)

    location 블록들: URL 경로에 따라 요청을 처리.

    location @nodebb: @nodebb라는 이름의 location 블록으로 요청을 전달.
    프록시 패스를 사용하여 Node.js 서버로 요청을 전달.

    location ~ ^/assets/(.*): 정규 표현식을 사용하여 URL 경로가 /assets/로 시작하는 요청을 처리.
    이 경우에는 정적 파일을 제공하기 위해 지정된 디렉토리에서 파일을 찾고, 없으면 Node.js 서버로 요청을 전달.

    location /plugins/: /plugins/의 요청을 처리.
    이 경우에는 정적 파일을 제공하기 위해 지정된 디렉토리에서 파일을 찾고, 없으면 Node.js 서버로 요청을 전달.

    location /: 기본적으로 모든 요청은 Node.js 서버로 전달.

  • 2 토픽
    4 게시물
    navystackN

    분위기에 맞게 조금 더 부드럽게 번역해 보았습니다.

    ZeeNuNew 2nd photo book 1에서 @duuni 님이 말했습니다:

    The moment I can feel at ease is when you pull me so close that I can lean my head on your shoulder.

    제가 편안함을 느끼는 순간은 어깨에 머리를 기댈 수 있을 정도로 가까이 끌어당길 때입니다.

    ZeeNuNew 2nd photo book 1에서 @duuni 님이 말했습니다:

    I adore every moment when you come close, wrap your arms around my waist, and smile at me.

    당신이 가까이 다가와 제 허리에 팔을 감싸고 미소 지을 때 그 모든 순간이 너무 좋아요.

  • 1 토픽
    1 게시물
    navystackN

    이 글에서는 Let's Encrypt에서 제공하는 TLS/SSL 인증서를 사용하여 PostgreSQL 서버를 설정하는 방법을 설명합니다.

    1.postgresql.conf 파일 준비하기

    postgresql.conf의 파일은 git clone으로 진행하시면 하실 필요가 없습니다. (덮어 쓰기가 됩니다.)

    전체 코드는 Github NavyStack/pgsql-docker에서 확인하실 수 있습니다.

    docker run -i --rm postgres cat /usr/share/postgresql/postgresql.conf.sample > postgresql.conf 2.인증서 준비하기 2.1 클라우드플레어 API 키 준비하기 (해당하는 경우) (CF_Token)

    클라우드플레어 API 키 발급 페이지로 이동하여 API키를 발급합니다.
    brave_GhZ5pebzcC.png

    brave_cIYflMqJrV.png

    brave_57yMMR2Fns.png

    그 후,

    export CF_Token="<token>" 2.2 클라우드플레어 계정 ID 확인하기 (해당하는 경우) (CF_Account_ID)

    클라우드플레어 대시보드에 접속하면 주소창 주소의 끝에 CF_Account_ID가 나옵니다.
    brave_SttMF40E5R.png
    그 후,

    export CF_Account_ID="<id>"

    acme.sh 를 통해서 발급 할 것이므로 ACME.SH를 설치합니다.

    curl https://get.acme.sh | sh -s email=admin@askfront.com

    Code_lmBJxxZnFO.png

    source /home/$USER/.bashrc acme.sh

    Code_FDYDHBWebB.png

    2.인증서 발급하기 acme.sh --issue --dns dns_cf -d heno.kr -d *.host.heno.kr --force --server letsencrypt

    Code_a3LeenFhzQ.png

    3. postgres 컨테이너 올리기 3.1. postgresql.conf 파일을 인증서의 경로 및 파일이름에 맞게 수정합니다.

    기본적으로 전부 주석처리 되어있으므로 파일의 원하는 곳에 입력합니다.

    ssl = on ssl_cert_file = 'fullchain.cer' ssl_key_file = 'heno.kr.key' ssl_prefer_server_ciphers = on 3.2. pg_hba.conf 파일을 필요에 따라 수정합니다.

    기본적으로 전부 주석처리 되어있으므로 파일의 원하는 곳에 입력합니다.

    hostssl all all 0.0.0.0/0 md5 docker-compose.yml 파일을 적절하게 수정합니다. services: postgres: container_name: postgres_container image: postgres:16-bookworm ports: - 5432:5432 volumes: - ./data:/var/lib/postgresql/data - ./logs:/var/log/postgresql - ./postgresql.conf:/var/lib/postgresql/data/postgresql.conf # - ./pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf - /home/ubuntu/.acme.sh/heno.kr_ecc/heno.kr.key:/var/lib/postgresql/data/heno.kr.key - /home/ubuntu/.acme.sh/heno.kr_ecc/fullchain.cer:/var/lib/postgresql/data/fullchain.cer - /var/lib/pgsql/data environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_USER=postgres - PGDATA=/var/lib/postgresql/data - PGSSLMODE=require docker compose up -d 4. Postgres 접속하기

    dbeaver_0yAXG6P6T1.png

    dbeaver_RJmqwM7fwO.png

    dbeaver_xYTQCcXYX0.png

    dbeaver_fpNKXKuw5R.png

    아래의 SQL문을 실행해서 TLS로 연결중인지 확인합니다.

    SELECT * from pg_catalog.pg_stat_ssl

    PostgreSQL의 자체적인 접속을 포함해서 나오네요

    조금 더 자세하게 보려면 아래의 SQL 문을 실행합니다.

    SELECT ssl.pid, usename, datname, ssl, client_addr, backend_type, wait_event FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity a WHERE ssl.pid = a.pid

    dbeaver_Lv90LvALoZ.png

  • 0 토픽
    0 게시물
    새로운 게시물이 없습니다.
  • 포럼에 대해 질문이 있으세요? 물어보세요!

    3 토픽
    7 게시물
    B

    @navystack 님도 편안한 밥 되세요

  • 사용자의 블로그 글 카테고리

    0 토픽
    0 게시물
    새로운 게시물이 없습니다.