配置服务器-项目上线(window开发,Linux运行)

1,300 阅读8分钟
本篇主要记录项目部署上线过程,window环境下开发完成项目后同步代码到服务器,服务器端环境配置,项目运行

内容列表

  • 服务器
  • IP地址
  • 域名
  • SSL
  • 网站备案
  • 服务器配置
  • window上同步代码环境配置
  • 服务器运行项目
  • 浏览器查看

服务器

线下实体服务器
    有钱可置办,当然也可以自己把电脑做服务器,需要花些时间配置
线上云服务器
    便宜,省事

IP地址

线下实体服务器
    申请购买,配置
线上云服务器
    已经帮我们配置好了

域名

有了服务器和IP之后就可以访问到服务器了,但是只能通过IP地址访问,不方便记忆,使用名字访问需要去申请域名

SSL

用于https

网站备案

玩网站的服务器

服务器配置 (centOS 7)

刚买的服务器,一般需要跟新些软件包

yum update

看项目架构安装一些其他包,node,MongoDB,Mysql ,nginx等
  1. 安装node

yum install nodejs

安装完成后,查看下node版本

node -v

yum install安装的版本取决于yum源 
如果版本比较低或不是自己想要的
可直接跟新源,也可先确认下目前有那些版本

yum --showduplicates list nodejs | expand

如果未发现有新版本,可以更新yum源再安装

curl --silent --location rpm.nodesource.com/setup_10.x | bash -
yum install nodejs

  1. 安装MongoDB

    1、建yum源[根据版本设置源]

vim /etc/yum.repos.d/mongodb-org-4.0.repo

写入如下配置
```
[mongodb-org-4.0]
name = MongoDB Repository
baseurl = https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/
gpgcheck = 1
enabled = 1
gpgkey = https://www.mongodb.org/static/pgp/server-4.0.asc

```
再执行以下命令

yum install -y mongodb-org

建议钉下包,以免跟新版本时,yum帮着升级了软件包

/etc/yum.conf

写入如下配置
```
exclude = mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools

```

如果想要本地代码连接远程MongoDB,需要使用 用户授权和auth登录,MongoDB初始时是没有账号和密码的,需要添加一个,在授权
  1. 安装nginx

yum install nginx (或者使用其他工具安装)

1、将申请好的Nginx SSL 文件:
    - 1_www.domain.com_bundle.crt 证书文件
    - 2_www.domain.com.key 私钥文件
同步到 Nginx 服务器的 /usr/local/nginx/conf 目录下(这里随便放哪里都可以,配置时使用对应路径就行)


2、编辑 Nginx 根目录下的 nginx.conf 文件。修改内容如下:
```
    server {
        listen 443; #SSL 访问端口号为 443
        server_name www.domain.com; #填写绑定证书的域名
        ssl on; #启用 SSL 功能
        ssl_certificate 1_www.domain.com_bundle.crt; #证书文件名称,放置文件的路径
        ssl_certificate_key 2_www.domain.com.key; #私钥文件名称,放置文件的路径
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #请按照这个协议配置
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #请按照这个套件配置,配置加密套件,写法遵循 openssl 标准。
        ssl_prefer_server_ciphers on;
        
        #可做代理,代理到不同后台服务器,node ,java 等,
        location / {
            root /var/www/www.domain.com; #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
            index  index.html index.htm;
        }
    }
```

3、重启Nginx
    nginx -s reload  :修改配置后重新加载生效
    
4、浏览器访问报403 Forbidden
    1.将nginx.config的user改为和启动用户一致
    2.缺少index.html或者index.php文件,就是配置文件中index index.html index.htm这行中的指定的文件。
    3.权限问题,如果nginx没有web目录的操作权限,也会出现403错误。
    4.SELinux设置为开启状态(enabled)的原因。
    这里是前两者原因,改好配置 重启Nginx,就能使用https访问了

5、HTTP 自动跳转 HTTPS 的安全配置(可选)
· 在页面中添加 JS 脚本。
· 在后端程序中添加重定向。
· 通过 Web 服务器实现跳转。
· Nginx 支持 rewrite 功能。若在编译时没有去掉 pcre,可在 HTTP 的 server 中增加 rewrite ^(.*) https://$host$1 permanent;,即可将默认80端口的请求重定向为 HTTPS。修改如下内容: 

    ```
    server {
        listen 80;
        server_name www.domain.com; #填写绑定证书的域名
        rewrite ^(.*)$ https://$host$1 permanent; #把http的域名请求转成https
    }
    ```

window上同步代码环境配置

我们一般在window,或者mac上写代码,然后再把代码同步到服务器上
mac开发环境比较好,省心
传代码 有些图形工具如xftp,这个太麻烦。使用脚本最好
用到make, rsync(替换了scp,功能更强大)

make => gnuwin32(老),新的是MSYS2 MINGW or Cygwin(首选)
这些工具不仅包含了make,还包含了其他一些类似unix,linux命令,比window自带的好用,一句话,美滋滋

安装的话,搜索对应名称下载安装就好
gnuwin32(不错),需要下载资源包(download.bat),跟新等,慢的很。搭建起来了就好了

可惜没有rsync包,需要自己配置,下载使用cwRsync

编写Makefile或者你喜欢的shell

``` Makefile
    time:
    	rsync -avC --progress --exclude=node_modules/ ./*  root@ip:/DEST
    	echo "upload xxxxxx over"
```
这个地方需要注意下需要同步代码的路径及隐藏文件。下文会提到

服务器运行项目

首先进入项目中,执行npm i 安装依赖,结果报图下错误

node-gpy

g++ Command not found,这个就是gcc没有安装,编译C的,用于node项目跨平台使用

yum -y update gcc 或者 yum -y install gcc+ gcc-c++

然后先把node_modules干掉,再npm i 安装依赖
提示:window上也需要配置相关环境,什么vs c++


启动项目看看能不能跑,报如下错误

import

babel转require语法报错
1、重新npm i 几次不行首先以为是依赖安装过程出错
2、怀疑是环境问题了,同步了python版本,使用nvm切换版本,与window上一致,重新npm i ,报错依旧
3、清理npm缓存,删除项目,重新上传代码,安装依赖,任然不行
4、看看是不是上传代码时丢文件了,最开始的时候想过这个问题,粗略看了下,没问题,加之理论上一般是不会出问题的,但是,仔细一看发现  文件首字符为.(英文句号)的隐藏文件没有( .babelrc)等。不出所料可以跑了。
问题出在rsync同步文件脚本本地文件目录选取问题,直接使用./* 当前目录下所有文件会同步,但不包含隐藏文件,子目录下的隐藏文件可以被同步,故替换下目录,使用上级文件目录即可


总结:也是醉了,最开始就想过这个问题,没有细致去比对文件,也是经验不足导致的。浪费了大量时间,总的来说知道了就好,然后就是代码最开始引入了babel-register 没有报错也是没有想过这个配置问题

浏览器查看

直接http,https访问网址,测试下能否跑通
基本上是没有问题,除了自己源代码写的问题

提示:
    如果刷新浏览器白屏了
    ```
     We're sorry but schedules doesn't work properly without JavaScript enabled. Please enable it to continue.
    ```
    1、极大可能是前台路由配置的是history模式,后台需要相应配置。(改成hash,或者配置nginx,匹配不到直接转到首页)
    2、也有可能是自己前端代码路由权限控制问题,router钩子函数中的处理逻辑
    

跑流程,增删改查:
发现添加的数据页面上没有保存,添加接口是请求成功的,然后再拉取数据,返回空结果,状态码304。发现get接口都是304
    1、nginx配置问题
        - 本地调试,通过代理直接正向代理到线上的node server,还是会出现上述问题,猜测应该不是nginx问题,因为并没有通过nginx做反向代理(没有走nginx监听的端口),get接口304
        - 直接关闭nginx服务(这里可以不用关闭,毕竟直接访问node server,没有走nginx监听,做绝对测试条件),直接访问线上node server 地址及端口,还是出现上述问题。get接口304
        - 这里不管是正向还是反向代理,后者直接访问都会去处理返回结果状态码,进行网络优化(相关服务器软件,框架自动做了优化)
    2、数据库没有存入数据(但是之前都是可以成功)
        - 数据库入库了,但是时间不对,2019-08-2创建的确都是2019-07-30计划,但是时间戳又没问题
    3、代码问题
        - 紧接第二步排查问题 time-formater格式化问题,所有换成本地开发环境,发现是没有任何问题。但不排除time-formater在window和在linux 上格式化问题(极小概率)
        - 觉得可能是是MongoDB版本问题,本地3.4,线上4.0版本,但是版本不同一般体现在api使用问题上,当前还是可以存入数据的,故为小概率
        - mongoose (感觉是主要问题)创建Schema 时 时间字段默认值导致。虽然在本地上没有问题,有可能是系统平台原因,下载的包不同,改后确实生效