단기 서버 배치 Nginx/Node/Nuxt/React/NG, 일반적인 최적화 및 자동 시작 스 크 립 트

25214 단어
머리말
작은 작업장 으로서 앞 뒤 엔 드 의 서 비 스 는 모두 한 서버 에 있 습 니 다.
업무 가 많아 지면 서 전단 이 드디어 던 져 졌 습 니 다.
테스트 라인 과 정식 라인 을 포함 하여 배치 해 야 할 것 은 다음 과 같다.
PC 홈 페이지 Angular6/백그라운드 관리 umi+react/모 바 일 공유 Nuxt/APP 내장 페이지 Nuxt닥 치 는 대로 기록 하고, 관심 있 는 것 을 보면, 아마도 너 를 도와 시간 을 좀 절약 할 수 있 을 것 이다.
뭐 공부 해요?
난잡 한 지식 점, linux 의 일부 동 동 shell ,chmod,chgrp ,chown 과 기초 운영 에 관 한 지식nginx 의 일부 동쪽, 비교적 현대 화 된 배치 (IE 11 이하 의 것 을 고려 하지 않 음).pm2node 등등
기초 환경
  • 시스템 버 전 선택 은 Centos 7.4 이 고 손 에 넣 으 면 바로 최신
  • 으로 업그레이드 된다.
    #      
    cat /etc/redhat-release
    #   
    yum update 
    #   
    reboot
    #            (  7.x   ..            )
    #                ,         ,         
    #       ,            ,       GG,       ,              
    cat /etc/redhat-release  # CentOS Linux release 7.6.1810 (Core)
    
    
  • node 버 전 은 시비 LTS 버 전 을 선택 하고 current 빠 른 교체 버 전 (11. x)
  • 을 선택한다.
    공식 wiki 제공: github. com/nodesource/...
  • 기초 의존 gcc, make 의존)
  • yum install gcc-c++ make
    
    

    그렇지 않 으 면 컴 파일 에 의존 하 는 사람들 이 이 잘못 을 보고 할 것 이다. 예 를 들 어 내 가 배치 nuxt 할 때 만난 것 이다.
  • yarn, 사용 하기 편 한 가방 관리자 (관청 원)
  • # centos
    curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
    sudo yum install yarn
    
  • nginx, 선택 한 것 은 lts(1.14.2)
  • nginx 공식 문 서 는 원본 을 제공 합 니 다. 직접 만 들 고 vim 에서 작성 하면 됩 니 다.
    www.nginx.com/resources/w…
    최신 LTS 업데이트 로그: ngix. org/en/CHANGES -...
  • git, 홈 페이지 소스 코드 설치
  • 원본 패키지: mirrors. edge. kernel. org/pub/softwar...
    # 2.x.x       (    )
    $ tar -zxf git-2.x.x.tar.gz
    $ cd git-2.x.x
    $ make configure #   
    $ ./configure --prefix=/usr #       (--prefix)
    $ make all doc info
    $ sudo make install install-doc install-html install-info
    #            (      ,      )
    

    물론 시스템 상 유 창 고 를 직접 yum 설치 할 수도 있 지만 버 전 은 비교적 낡 았 다.
    그리고 제3자 소스 도 선택 할 수 있 습 니 다. (안전 위험 은 스스로 부담 합 니 다)
    배치 하 다.
    nginx 를 설치 한 후 기본 값 으로 는 다음 과 같은 몇 가지 가 있 습 니 다.
  • git: 웹 페이지 를 저장 하 는 곳
  • html(/usr/share/nginx/html): 이 디 렉 터 리 에 있 는 conf(/etc/nginx/conf.d/) 파일 은 conf 에 추 가 됩 니 다. 구체 적 으로 nginx.conf 사용 되 었 습 니 다 nginx.conf
  • include: logs(/var/logs/nginx) 기본 로그 의 저장 위치
  • 예 를 들 어 nginx 당신 자신 도 지정 할 수 있 습 니 다. 설정 파일 을 얼마나 섬세 하 게 빼 도 됩 니 다.
    내 가 사용 한 최신 include, 초기 화 lts 는 대체로 이렇다. 어떤 것 은 내 가 넣 은 것 이다.
    텐 센트 클 라 우 드 는 대응 하 는 nginx.conf 중국어 수첩 이 있다.
    주의 점
    최신 버 전의 기본 실행 사용 자 는 nginx 이 고 일부 버 전 은 nginx 입 니 다.
    따라서 코드 영역 은 기본 www-data 기본 경로 에 두 지 않 으 면 권한 을 수정 하고 nginx 집 디 렉 터 리 에 두 지 마 십시오.
    그렇지 않 으 면 root 초과 관리 권한 (해당 하 는 사용자 그룹 가입) 을 부여 하고 이 디 렉 터 리 의 소속 을 변경 해 야 합 니 다.
    비교적 합 리 적 인 방법 은 코드 디 렉 터 리 를 루트 디 렉 터 리 에 저장 하고 새 폴 더 를 저장 하 는 것 입 니 다.
    
    #         
    #               nginx,    nginx, chown(change owner)
    chown -R nginx:nginx /code
    
    #    chgrp      (change group)
    
                   ,    755
    chmod -R 755 /code
    
    
    `755 : rwx-rx-rX => u(user)-g(group)-o(other) => r(read[ ]:4)-x(excute[  ]:1)-w(write[ ]:2)`
    
    #          ,  cpu ,    ,      /proc    
    #  /proc/cpuinfo(cpu  ) ,meminfo(    ) 
    
    

    nginx 에서 가장 자주 사용 하 는 명령
  • nginx: 설정 파일 이 정상 인지 테스트 합 니 다. 오류 가 발생 하면 직접 던 집 니 다. 설정 파일 을 변경 한 후 서 비 스 를 다시 시작 하 는 것 을 피하 십시오!검증 은 유일한 진리
  • nginx -t: 설정 파일 을 다시 불 러 옵 니 다. 서 비 스 를 다시 시작 할 필요 가 없습니다. 변경 nginx 설정 은 이 걸 로 직접 유효 합 니 다. 지연 되 지 않 습 니 다
  • nginx.conf
    
    #     
    user  nginx;
    worker_processes auto; #    ,     
    worker_rlimit_nofile 65535; # worker            
    
    events { #          ,    
        multi_accept on; #            
        use epoll; #     
        worker_connections 65535; #       
    }
    
    #       
    error_log  /var/log/nginx/error.log warn;
    
    # pid(process id),      linux         , pid  nginx  
    pid        /var/run/nginx.pid;
    
    
    
    
    http {
        charset utf-8; #      
        sendfile on; #            
        tcp_nopush on; #   sendfile       ,    ,                ,    
        tcp_nodelay on; #       ,       keep-alive     TCP        tcp_nodelay
        server_tokens off; #       ,     nginx  
        log_not_found off; #                ,  favico
        types_hash_max_size 2048; #      ,    
        client_max_body_size 16M;  #        body    (         )
        include       /etc/nginx/mime.types; #      ,     mime ,         
    
        default_type  application/octet-stream; # nginx       
    
        #     
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        #     
        access_log  /var/log/nginx/access.log  main;
    
    
        # SSL
        ssl_session_timeout 1d; #       ssl      ,      
        ssl_session_cache shared:SSL:50m; #ssl/tls          ,    1M     4000 sessions
        ssl_session_tickets off; #         
    
        #   TLS1.2     
        ssl_protocols TLSv1.2;
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;
        ssl_prefer_server_ciphers on; #                   
    
        #           
        ssl_stapling on; 
        ssl_stapling_verify on;
        #         DNS     ,            DNS   .       
        resolver 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
    	resolver_timeout 2s;
    
        #       
        keepalive_timeout  65;
    
        #         (       )
        #         ,             ,          
        #gzip  on; 
        
    
        include /etc/nginx/conf.d/*.conf;
    }
    

    내 가 가지 고 있 는 nginx -s reload 과 일반적인 포장 항목 을 가지 고 있다.
  • nginx or nginx

  • 일반적인 배치: 이러한 배 치 는 nuxt 하나 react 에 적용 된다.
    
    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name proadmin.xxxx.com;
        root /code/react-sx-admin/prod;
        # SSL    
        ssl_certificate /etc/nginx/conf.d/cert/proadmin/proadmin.crt;
        ssl_certificate_key /etc/nginx/conf.d/cert/proadmin/proadmin.key;
        ssl_trusted_certificate /etc/nginx/conf.d/cert/proadmin/proadmin.crt;
        # SPA   history  ,         ,       
        location / {
            try_files $uri $uri/ /index.html;
        }
        #     
        location ~ /\.(?!well-known) {
            deny all;
        }
        #            
        location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
            expires 7d;
            access_log off;
        }
        #     svg     ,   
        location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
            add_header Access-Control-Allow-Origin "*";
            expires 7d;
            access_log off;
        }
        # gzip     
        gzip on;
        gzip_vary on;
        #        ,      (         )
        gzip_proxied any;
        #     ,   
        gzip_comp_level 6;
        #        
        gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
    }
    # http          https
    server {
        listen 80;
        listen [::]:80; #       
        server_name proadmin.xxx.com;
        location / {
            #       $host   (    )
            return 301 https://proadmin.xxx.com$request_uri;
        }
    }
    
    
    
  • ng6

  • 역방향 대리: 이런 것 은 서비스 에 더 많이 적용 된다. 예 를 들 어 build 이 이 끌 어 가 는 것 과 다른 서 비 스 를 제공 할 수 있 는 것 이다.
    
    #    nuxt          ,          
    # https://zh.nuxtjs.org/faq/nginx-proxy/
    map $sent_http_content_type $expires {
        "text/html" epoch; # epoch 1970     
        "text/html; charset=utf-8" epoch;
        default off;
    }
    server {
        listen 80;
        server_name proshare.xxx.com;
    # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
        return 301 https://$host$request_uri;
    }
    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name proshare.xxx.com;
        gzip on;
        gzip_types text/plain application/xml text/css application/javascript;
        gzip_min_length 1000;
        location / {
            expires $expires;
            proxy_redirect off;
            proxy_set_header Host               $host;
            proxy_set_header X-Real-IP          $remote_addr;
            proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto  $scheme;
            proxy_read_timeout 1m;
            proxy_connect_timeout 1m;
            proxy_pass http://127.0.0.1:5555;
        }
        location ~ /\.ht {
            deny all;
        }
        ssl_certificate /etc/nginx/conf.d/cert/proshare/proshare.crt;
        ssl_certificate_key /etc/nginx/conf.d/cert/proshare/proshare.key;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
        ssl_prefer_server_ciphers on;
    }
    
    

    일반 스 크 립 트
    서버 가 다운 되 지 않 을 수 없습니다. 다운 되 었 을 때 필요 한 서 비 스 는 다시 사용 해 야 합 니 다.
    셀 프 스 크 립 트
    nginx 시작dist 로 유지 하면 됩 니 다. nuxt;
    node 에 설 치 된 nginx 는 이 유지 보 수 를 이용 하여 자체 적 으로 systenctl 규범 화 된 서 비 스 를 작성 해 야 합 니 다.
    그리고 systemctl enable nginx 이 스 크 립 트 를 yum 에 놓 으 면 systemctl 유지 할 수 있 습 니 다.chmod 754
  • 공식 적 /usr/lib/systemd/system 의 표기 법 보기
  • # /usr/lib/systemd/system/nginx.service
    #              ,          
    #     ,     ,    ,    ,        PID  
    
    [Unit] 
    Description=nginx - high performance web server
    Documentation=http://nginx.org/en/docs/
    After=network-online.target remote-fs.target nss-lookup.target
    Wants=network-online.target
    
    [Service]
    Type=forking
    PIDFile=/var/run/nginx.pid
    ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s TERM $MAINPID
    
    

    www. cnblogs. com/sparkdev/p/...
    pm2 달리기 종목systemctl 지금까지 발전 하면 서 최신 판 의 기능 이 비교적 완선 되 었 고 자체 작 동 체 제 를 내장 한 것 이다.754 : rwx-rx-r => u-g-o => r(read[ ]:4)-x(excute[ ]:1)-w(write[ ]:2) 의 자체 시작 체 제 를 식별 할 수 있 습 니 다. 예 를 들 어 우리 가 사용 하 는 것 이 nginx service 인 것 을 발견 하면 pm2 의 서비스 설명 파일 을 생 성 할 수 있 습 니 다.
  • linux: 서 비 스 를 시작 합 니 다
  • systemctl: 서비스 가 정상적으로 작 동 하 는 지 확인
  • nginx.service: 현재 실행 중인 작업 저장
  • 자체 시동 에 가입
  • 코드 발표
  • node 의 용 pm2 start [services] pm2 list pm2 save (통 해 원 격 으로 발표)
  • 공개 키 짝 짓 기 (원 격 창 고 는 git ssh 모드) 를 설정 하 십시오. 그렇지 않 으 면 초기 화 할 수 없습니다. 예 를 들 어 pm2테스트 아래 와 정식 라인 이 있 기 때문에 나 는 설정 을 두 개 로 쓰 고 두 드 리 는 코드 를 줄 이기 위해 한 무더기 deploy 를 썼 다.
    #       ?
    #  pm2   : https://pm2.io/doc/en/runtime/guide/easy-deploy-with-ssh/?utm_source=pm2&utm_medium=website&utm_campaign=rebranding
    
    #   
    #           $1,       ,            ,  dev prod  
    pm2init(){
       pm2 deploy ./ecosystem.$1.config.js $1 setup;
       pm2 deploy ./ecosystem.$1.config.js $1;
    }
    pm2up(){
      pm2 deploy ./ecosystem.$1.config.js $1 update;
    }
    pm2rev(){
      pm2 deploy ./ecosystem.$1.config.js $1 revert;
    }
    
    
    
    #pm2
    alias pm2init=pm2init
    alias pm2up=pm2up
    alias pm2rev=pm2rev
    
    #      
    # pm2init depoly_name => pm2init dev
    
    

    ecosystem.config.js
    
    module.exports = {
      apps: [
        {
          name: 'stag-sx-share',
          script: 'npm',
          args: 'run start',
          watch: ['.nuxt'], //       
          watch_options: {
            usePolling: true
          },
          env: {
            HOST: '0.0.0.0',
            PORT: 3333,
            NODE_ENV: 'development'
          },
          env_production: {
            NODE_ENV: 'production',
            HOST: '0.0.0.0',
            PORT: 3333
          },
          output: './logs/console.log',
          error: './logs/consoleError.log',
          merge_logs: true,
          log_date_format: 'YYYY-MM-DD HH:mm Z'
        }
      ],
      deploy: {
        dev: {
          // SSH user
          user: 'root',
          // SSH host
          host: ['xxxx'],
          // SSH options with no command-line flag, see 'man ssh'
          // can be either a single string or an array of strings
          ssh_options: 'StrictHostKeyChecking=no',
          // GIT remote/branch
          ref: 'origin/master',
          // GIT remote
          repo: '[email protected]:lqh/nuxt-sx-mobile-share.git',
          // path in the server
          path: '/code/stag-nuxt-sx-share',
          // Pre-setup command or path to a script on your local machine
          'pre-setup': 'ls -la',
          'pre-deploy': 'git pull',
          // deploy hook
          'post-deploy':
            'npm install && pm2 reload ./ecosystem.dev.config.js --env production --force'
        }
      }
    }
    
    
    
  • 포장 한 것 을 직접 사용 ssh 발표
  • 내 가 쓴 한 줄 Coding 로 설명 하 자. 그래도 편리 하 다.
    # rsync      
    # -r :   recursive,  ,   ,               !
    # -c :        ,   ,     
    # -h : --human-readable                         
    # -v :   verbose,       
    # --progress :          
    # --delete :            ,            ,    !
    
    alias fdumi="rsync -vrch --progress --delete  /Users/linqunhe/Code/umi_dva_sx_admin/dist/* [email protected]:/code/umi-dva-sx-admin/dev"
    

    총결산
    재 미 있 으 면 애플 릿 을 쓸 준 비 를 했 습 니 다. 신선 하고 갓 나 온 큰 수요, 준비 용 alias 으로 쓸 준 비 를 했 습 니 다.rsync 때 하나 썼 는데 지금 alias 어떻게 변 했 는 지 모 르 겠 어 요.
    한 사람의 전 투 는 줄곧 그렇게 시큰시큰 하 였 는데, 다음 접 판 협 이 받 기 어 려 울 것 같 아서, 아마 모두 무 너 져 다시 할 것 같다.
    제 가 먼저 구 덩이 를 밟 겠 습 니 다. Taro 그 시 리 즈 는 연기 되 어야 합 니 다. 연말 수요 가 계속 삽입 되 고 있 습 니 다.
    그래도 다행 입 니 다. 그때 taro 0.x 도 나 올 것 같 습 니 다. 잘못된 점 은 댓 글로 남 겨 주세요. 바로 수정 하 겠 습 니 다. 감사합니다.

    좋은 웹페이지 즐겨찾기