웹 사이트를 호스팅하도록 새로운 VPS 구성

18048 단어 vpubuntunextjsmongodb
Namecheap에서 새 VPS(Ubuntu 20.04)를 받았습니다. Namecheap의 기본 VPS 계층은 AWS lightsail의 이전 기본 계층보다 두 배의 CPU, RAM 및 스토리지를 제공하는 것 같습니다.

이 저널은 다음과 같이 간결하게 설명합니다. 새 웹 사이트를 호스팅하기 위해 새 VPS를 구성하는 방법peiwen.me .

알림:

이 명령을 원격 서버에 ssh 한 번만 실행하십시오.

apt update
apt install curl


메모:
  • apt는 Linux 패키지 관리 시스템
  • 입니다.
  • '재미있는' 사실: apt cmd는 2014년에 도입되었으며 Ubuntu 16.04 릴리스 이후 더 빠르고 친숙하며 사용하기 쉽도록 부분적으로 대체되었습니다apt-get.



    먼저! SSH


  • mosh는 우수한 모바일 셸입니다. 반응성이 뛰어나고 로컬과 원격 모두에 설치해야 합니다.
  • 편의상 로컬 ssh 구성:

  •   # add info to local file: ~/.ssh/config
      Host <name_your_remote>
        HostName <static_IP>
        User <remote_username>
        IdentityFile <path_to_local_id_rsa>
        IdentitiesOnly yes
    


  • 원격 ssh 구성:

  •   # local shell
      ssh <user>@<static_IP>
    
      # remote shell
      mkdir .ssh
      touch authorized_keys
      apt-get install nano # just in case
      apt-get install mosh # just in case
      nano authorized_keys
      # paste the content of the local file 'id_rsa.pub' to this file, save and exit
    


  • 지금! 당신은 할 수 있습니다 ~

  •   # local shell
      mosh <name_your_remote>
      ssh <name_your_remote>
    



    노드JS



    nvm




    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
    # might need to reconnect remote for `nvm` command to work properly
    


    참고: 최신nvm 설치 스크립트here를 확인하십시오.

    마디




    nvm list-remote
    nvm install stable # or pick one from the list
    nvm list
    node -v
    npm -v
    npm install --global yarn # recommended
    


    참고: "nvm 'command' not found"인 경우 - 확인'Troubleshooting on Linux Section'


    몽고DB



    v5.0 설치 문제

    🔥 v5.0을 설치할 때 발생한 정확한 problem - mongod 서비스가 시작되지 않습니다. 이유는 다음과 같습니다.

    > VM의 CPU는 CPU flags에 나열되어야 하는 MongoDB 5.0에 필요한 명령(예: AVX 및 SSE)을 지원하지 않습니다.
    > flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr
    발견된 유사한 문제:
  • mongodb community forum
  • stack-overflow

  • CPU 유형을 확인하려면 apt install procinfo를 실행하여 cat /proc/cpuinfo를 설치해야 할 수 있습니다.

    MongoDB v4.4 커뮤니티 에디션 설치




    wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
    
    echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
    
    sudo apt-get update
    
    sudo apt-get install -y mongodb-org=4.4.15 mongodb-org-server=4.4.15 mongodb-org-shell=4.4.15 mongodb-org-mongos=4.4.15 mongodb-org-tools=4.4.15
    


    시작 및 구성




    sudo systemctl start mongod
    sudo systemctl status mongod
    sudo systemctl enable mongod
    mongo
    mongosh
    


    참고: sudo 수퍼유저인 경우 root를 생략할 수 있습니다.

    MongoDB 제거

    sudo service mongod stop
    sudo apt-get purge mongodb-org*
    sudo rm -fr /var/log/mongodb
    sudo rm -fr /var/lib/mongodb
    

    보안 체크리스트



    MongoDB Guide

    복제본 백업을 생성하기 위한 IP 바인딩



    Mongo


    힘내



    설치




    apt update
    apt install git
    git --version
    


    설정



    소스로 푸시가 필요한 경우 사용자 이름을 설정하려면

    git config --global user.name <username>
    git config --global user.email <email>
    git config --list # or ↓ directly check gitconfig file
    nano ~/.gitconfig
    


    2021년부터 github repos와 SSH 통신만 허용되기 때문에 코드를 편집하고 소스에 푸시하는 경우에는 이것만으로는 충분하지 않습니다.

    복제 저장소



    웹 저장소를 ~/web/에 복제하고 deps를 설치합니다.

    git clone <repo_address>
    cd <project>
    
    yarn
    # OR
    npm i
    


    .env.local 구성




    touch .env.local
    nano .env.local
    

    .env.local 내용 ↓

    MONGODB_URI=<get_this by typing mongosh>
    MONGODB_DB=journal
    
    PASS=<some_password>
    NEXT_PUBLIC_PASS_TOKEN=<some_JWT_like_token>
    
    NEXT_PUBLIC_REVAL_TOKEN=<some_token_for_revalidation_token>
    


    짓다




    yarn build
    yarn global add pm2
    pm2 start yarn --name "peiwen.me" -- start
    pm2 ls
    
    # to start on startup
    pm2 startup
    # to freeze/save the processes
    pm2 save
    



    엔진엑스



    1. 방화벽 설치, 구성 및 nginx 활성화




    apt install nginx
    
    # firewall
    ufw app list
    
    # returns
    Available applications:
      Nginx Full
      Nginx HTTP
      Nginx HTTPS
      OpenSSH
      mosh
    
    # enable firewall
    ufw allow 'Nginx Full'
    ufw allow OpenSSH # important
    ufw allow mosh
    ufw enable
    ufw status
    
    # returns
    Status: active
    To                         Action      From
    --                         ------      ----
    Nginx Full                 ALLOW       Anywhere
    OpenSSH                    ALLOW       Anywhere
    mosh                       ALLOW       Anywhere
    Nginx Full (v6)            ALLOW       Anywhere (v6)
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    mosh (v6)                  ALLOW       Anywhere (v6)
    
    # check your nginx server
    systemctl status nginx
    
    # get your IP if you don't already know for some reason
    curl -4 icanhazip.com
    <IP_address>
    
    # enter this <IP_address> into the browser, you should be able to see the landing page of nginx
    
    # lastely, enable it on every boot
    systemctl enable nginx
    


    2. 서버 블록 설정



    nginxserver block는 폴더 안에 있는 파일입니다/etc/nginx/sites-available/.

    cd /etc/nginx/sites-available
    touch <new_domain> # optional
    nano <new_domain>
    


    콘텐츠 삽입:

    server {
      # the name of your domain
      server_name <new_domain> www.<new_domain>;
    
      location / {
        # this must stay localhost. The port must be the same as your Next.js project
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
      }
    
      # simple headers
      add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
      add_header X-XSS-Protection          "1; mode=block" always;
      add_header X-Frame-Options DENY always;
    
      # this will serve the project on port 80
      listen 80;
    }
    


    3. nginx를 확인하고 다시 로드하여 적용합니다.




    # check all working
    nginx -t
    
    ln -s /etc/nginx/sites-available/<new_domain> /etc/nginx/sites-enabled/
    
    systemctl reload nginx
    


    추신. 잊지 마요


  • 업데이트host records: 서버 IP( which record type to choose )
  • 를 가리킵니다.

    참조:
  • Digital ocean guide
  • Nginx Directory Structure
  • nginx beginners guide



  • SSL



    1. certbot 설치 및 일부 준비




    apt install certbot python3-certbot-nginx
    
    # firewall settings
    ufw allow 'Nginx Full'
    ufw allow 'Nginx HTTPS'
    ufw deny 'Nginx HTTP'
    ufw status
    
    # check if the <server_name> is exactly the format "example.com www.example.com"
    nano /etc/nginx/sites-available/example.com
    


    2. SSL/TLS 인증서 받기




    # do not forget the '-d' before www.example.com
    certbot --nginx -d example.com -d www.example.com
    # enter your email...
    


    Once you configure HTTPS, Certbot completes generating the certificate and reloads Nginx with the new settings.

    Finally, the output displays that you have successfully generated a certificate and specifies the location of the certificate on your server. /etc/letsencrypt/live/example.com/fullchain.pem (success)



    참조: How to Secure Nginx with Let's Encrypt On Ubuntu 20.04

    지금 nginx 파일을 열면nano /etc/nginx/sites-available/example.com 추가 정보가 추가된 것을 볼 수 있습니다.

    server {
      server_name <new_domain> www.<new_domain>;
    
      location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
      }
    
      add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
      add_header X-XSS-Protection          "1; mode=block" always;
      add_header X-Frame-Options DENY always;
    
      # ↓ the following lines are added by Certbot
    
      listen 443 ssl; # managed by Certbot
      ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
      ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
      include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
      ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    }
    
    server {
        if ($host = www.example.com) {
            return 301 https://$host$request_uri;
        } # managed by Certbot
    
        if ($host = example.com) {
            return 301 https://$host$request_uri;
        } # managed by Certbot
    
      server_name example.com www.example.com;
      listen 80;
        return 404; # managed by Certbot
    }
    } # an extra for some reason...
    



    # check certificate's auto-renewal
    certbot renew --dry-run
    


    3. 자동 인증서 갱신을 활성화하도록 Cronjob 설정




    # open Crontab
    crontab -e
    


    줄 추가:

    # Schedule it to run daily at a specified time (in this example, it does so at 05:00 a.m.)
    0 5 * * * /usr/bin/certbot renew --quiet
    



    유지하다




    # in remote <site_folder>
    git pull && yarn build && pm2 restart peiwen.me
    



    유용한 기사 😄


  • Linux Filesystem Tree Overview
  • Ubuntu manual - file hierarchy
  • Add Google Analytics to NextJS App
  • 좋은 웹페이지 즐겨찾기