单机服务器部署Nginx/Node/Nuxt/React/NG,常规优化,常规自启脚本

栏目: 服务器 · Nginx · 发布时间: 7年前

内容简介:作为小作坊,之前前后端的服务器全部一股脑的都在一个服务器,随着业务多了些,前端这块终于扔出来了(独立)...虽然只有双核2M带宽;需要部署的有这么几个,测试线及正式线:PC官网/管理后台/移动端分享/APP内嵌页

作为小作坊,之前前后端的服务器全部一股脑的都在一个服务器,

随着业务多了些,前端这块终于扔出来了(独立)...虽然只有双核2M带宽;

需要部署的有这么几个,测试线及正式线:PC官网/管理后台/移动端分享/APP内嵌页

随手记,有兴趣的看看,也许可以帮你省点时间..

你能收获什么?

杂七杂八的知识点, linux 的一些东东 shell ,chmod,chgrp ,chown 以及基础运维的一些知识

nginx 的一些东东,比较现代化的配置(不考虑IE11以下的);

pm2node 什么的一些东东

基础环境

  • 系统版本选型是 Centos 7.4 ,到手后麻溜升级到最新的
# 查看版本号
cat /etc/redhat-release
# 更新
yum update 
# 重启
reboot
# 适用于非跨版本大版本的(比如7.x的升级..跨版本的此法子不一定适用)
# 也不建议服务器突然跨大版本升级,新机子就直接上新的,反则全部重新部署的
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 的时候遇到的

单机服务器部署Nginx/Node/Nuxt/React/NG,常规优化,常规自启脚本
  • 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的更新日志: nginx.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 安装系统上游仓的 git ,只不过版本比较老

还有第三方源也是一个可选的(安全隐患自己承担)

部署

安装好nginx之后,默认的常用有这么几个:

  • 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,用户组为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)`

复制代码
# 使用用户
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;
}
复制代码

拿我手头的一个 nuxt 和一个常规打包项目

  • react or ng6

常规部署:这类部署适用于 build 出来一个 dist 这类

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;
    }
}


复制代码
  • nuxt

反向代理 : 这种更多的适用于服务的,比如 node 带动的,已经其他可以提供服务的

# 这段是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启动

systenctl 维护就好, systemctl enable nginx ;

yum 安装的nginx,要用这个维护,自行写一个 systemctl 规范的服务;

然后 chmod 754 这个脚本,放到 /usr/lib/systemd/system ,即可用 systemctl 维护;

754 : rwx-rx-r => u-g-o => r(read[读]:4)-x(excute[执行]:1)-w(write[写]:2)

  • 瞅瞅官方的 nginx service 的写法
# /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跑项目

pm2 发展至今,最新版的功能都比较完善了,是有内置自启动机制的;

会识别 linux 的自启动机制,比如发现我们用的是 systemctl 就会生成一份 nginx.service 的服务描述文件

pm2 start [services]
pm2 list
单机服务器部署Nginx/Node/Nuxt/React/NG,常规优化,常规自启脚本
  1. pm2 save : 保存当前正在运行的任务
单机服务器部署Nginx/Node/Nuxt/React/NG,常规优化,常规自启脚本
  1. 加入到自启动里面
单机服务器部署Nginx/Node/Nuxt/React/NG,常规优化,常规自启脚本

至于代码发布

  • node的用 pm2deploy (通过 ssh 发布到远端)

有测试下和正式线,所以我把配置写成两个,又为了减少敲打的代码,我写了一堆 alias

# 这些命令是啥?
# 看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: 'git@git.dev.tencent.com: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'
    }
  }
}


复制代码
  • 打包的,直接用 rsync 发布

就拿我写的一条 alias 来讲解吧,还是挺方便的;

# 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/* root@xxx.xxx.xxx:/code/umi-dva-sx-admin/dev"
复制代码

总结

码玩了就准备写小程序的,新鲜刚出炉的大需求...打算用 Taro 写,

虽然在 taro 0.x 的时候写过一个,现在 1.2 都不知道变化如何了...

一个人的战斗一直都是那么酸爽,前端就一直只有我一个,感觉下一个接盘侠不好接,估计会全部被推倒重做

我先去踩踩坑, nest 那个系列要延期了,年末的需求一直穿插追加...迷之微笑.

不过还好,估计到时候 nest 6 也出来了..不对之处请留言,会及时修正.谢谢阅读


以上所述就是小编给大家介绍的《单机服务器部署Nginx/Node/Nuxt/React/NG,常规优化,常规自启脚本》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Writing Apache Modules with Perl and C

Writing Apache Modules with Perl and C

Lincoln Stein、Doug MacEachern / O'Reilly Media, Inc. / 1999-03 / USD 39.95

Apache is the most popular Web server on the Internet because it is free, reliable, and extensible. The availability of the source code and the modular design of Apache makes it possible to extend Web......一起来看看 《Writing Apache Modules with Perl and C》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具