基于EC2,配置一个全栈服务实例(nginx + tomcat + mysql)

最近世道动荡,在前往高级的路上走出了车到山前必有路,睁眼一看是绝路的感受。因此就索性瞎折腾一下。领了一个服务器,开启了一个伪全栈的运维之路,各类服务线上部署。javascript

服务器申请与实例链接接

腾讯免费七天,阿里要钱,山里娃就在亚马逊AWS申请了一个可无偿使用一年的EC2云服务器,申请连接,步骤很简单,跟着提示一步一步整就是,惟一要提醒的就是,须要准备一张信用卡,一张能支持外汇($)结算的最好。
申请到资格后,选择你的云服务,选择对应的区域,你须要给服务实例选择一个操做系统,linux,windows经常使用的均可选(注意观察,咱们只选免费的,很重要,很重要, 很重要)。而后配置安全组,bla,bla,....,而后启动实例。保存好你的密钥,而后打开ssh终端链接实例。操做步骤能够打开管理面板,选择实例-》选择实例-》链接-》根据面板提示链接。css

clipboard.png

安装与配置

基础组件安装与配置

登陆进服务后,就能够开启一段服务器配置之旅了。若是你和我同样,对Linux经常使用的命令行还不熟悉,你可能须要这样一份手册:Linux经常使用命令大全。我选择的镜像是Ubuntu,若是你和我选择的同样,那么下面的命令你能够直接用,若是是redhat或者centos,有些命令,你须要本身去探索。先把一些经常使用的工具安装上:html

sudo apt-get install unzip // 解压工具
    sudo apt-get install git   // git工具
    sudo apt-get install wget // 下载工具  
    sudo apt-get install nginx // 下载nginx

node服务安装与配置

node安装是一个相对简单的过程,你能够直接查看官网,而后按照提示一步一步进行。很是重要的一步就,你须要创建你命令的软连接。在这里我列出本身的操做步骤:
-下载:sudo wget https://nodejs.org/download/r...前端

  • 建一个文件夹:sudo mkdir -p /usr/local/lib/nodejs
  • 解压到上面新建文件夹:sudo tar -xJvf node-v8.16.0-linux-x64.tar.xz -C /usr/local/lib/nodejs
  • 创建node可执行命令连接:sudo ln -snf /usr/local/lib/nodejs/node-v8.16.0-linux-x64/bin/node /usr/bin/node
  • 重复上述步骤,创建npm可执行连接
  • 测试有效性:node -v // node-v8.16.0

jdk的安装与配置

centos可参考连接,同时也适用于ubuntu,如今使用wget下载jdk有点麻烦(须要鉴权),因此我是本地下载,而后scp上传上去的,如下是个人操做:java

  • 上传:scp -i "big.pem" jdk-8u211-linux-x64.tar.gz ubuntu@ec2-13-114-140-94.ap-northeast-1.compute.amazonaws.com:/home
  • 解压并重命名为tomcat:tar xzf jdk-8u211-linux-x64.tar.gz
  • 创建连接java,javac,jar:sudo ln -snf /home/tomcat/bin/java(你解压后的目录) /usr/bin/java, 其余两个照作
  • 测试: java -version

tomcat服务的安装与配置

  • 下载 wget http://mirrors.tuna.tsinghua....
  • 解压
  • 进入到bin目录,而后执行 ./startup.sh
  • 实例ip查看服务运行状况(前提是在安全策略容许了8080端口的链接)

数据库的安装与配置

mysql的安装复杂一点,折腾了本身大量时间,在redhat8上没有安装成功mysql5,也迫使我把镜像换成了ubuntu,曲折的路就很少说了,直接说顺利的。若是直接使用apt-get install mysql安装,默认是安装mysql8,因此在开启安装前,须要借助mysql-apt-config增长一段配置,具体安装步骤,请查考前人栽下的树:Ubuntu 16.04安装MySQL:经过APT方式安装。
安装好以后,开启mysql,并登陆node

  • 开启:sudo service mysql start
  • 查看端口:sudo netstat -anp | grep mysql
  • 登陆:sudo mysql -u root -p
  • 显示数据库:show databases

至此,本地连接已经ok,可是mysql远程连接数据库仍然报无发链接。缘由不少,这里说起两个我遇到的。mysql

  • 实例安全策略:实例安全策略默认只开启了22端口,若是你像我同样,你还须要开启3306端口(和mysql相关),80端口,443端口
  • mysql本身的安全策略,默认只对127.0.0.1开启,即本地开启

第一种很简单,去EC2面板上修改你正在用的安全策略,加入3306端口,并启用。
第二种稍微麻烦一点,你须要以下操做:react

  • 打开mysql配置文件vim /etc/mysql/mysql.conf.d/mysqld.cnf,字段以下图所示

clipboard.png

  • 将bind-address = 127.0.0.1注销
  • 登陆mysql,并执行grant all privileges on . to 'root'@'%' identified by 'yourpassword';在有些版本上,不能直接这样操做root用户,因此,你须要新建一个用户,而后对这个用户执行grant all privileges操做
  • flush privileges;​
  • 重启mysql,或则你的实例

关于sql批量导入 linux

  • 导出:mysqldump -u root -p -d targetDatabaseName > targetFileName.sql, 根据提示,输入密码,导出ok,当前文件价应该就存在一个targetFileName.sql,里面包含了表数据与结构;
  • 远程导入mysqldump -h 132.72.192.432 -P 3306 -u root -p targetDatabaseName < targetFileName.sql(导入以前你得已经建立了targetDatabaseName库)
  • 上面的远程操做不必定好使,下面的这种操做,成功率更高。ssh远程登陆,而后mysql登陆,建立你的targetDatabase库,而后use targetDatabase,采用source命令:source /targetFile/targetFileName.sql;回车,便可导入成功,在这些操做以前,你须要将你本地的sql文件经过scp传送到远端服务器;

nginx配置与域名的解析

安装nginx,无非就想解决静态资源访问,反向代理,gzip,负载均衡问题,因为我这是初级使用,没有涉及到负载均衡的情形。nginx

运行

前面已经安装了nginx,看是否安装成功,可以使用命令运行:

sudo systemctl start nginx.service
   // 其余经常使用命令
   sudo systemctl stop nginx.service
   sudo systemctl reload nginx.service
   sudo systemctl status nginx.service

而后经过ip访问80端口,若是顺利能够看到,可是通常都是不顺利,显示403。
clipboard.png

解决nginx权限不足形成的访问问题

可参考链接:nginx权限不足形成的访问问题,我遇到的是第四项,即SELinux。

开启静态资源服务

我要代理的静态资源是一个react框架打包的网站,话很少说,直接列出个人配置:

server {
        listen       80;
        listen       [::]:80;
        server_name  h5.closertb.site;
        index index.html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / {
            root   /home/static;
            autoindex on;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

服务的代理

个人后端服务是基于tomcat,端口为8080。

server {
        listen       80;
        listen       [::]:80;
        server_name  server.closertb.site;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            proxy_pass       http://127.0.0.1:8080;
            proxy_set_header Host      $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

门户网站是一个基于nextJs的ssr渲染,因此须要代理一个node服务,这个服务运行在8500端口

server {
        listen       80;
        listen       [::]:80;
        server_name  client.closertb.site;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            proxy_pass       http://127.0.0.1:8500;
            proxy_set_header Host      $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

关于nginx代理的一些常识,从上面三段配置,咱们能够看到,咱们都是对80端口进行了代理,但能够设置不一样类别,指向不一样资源,区分点就在于server_name,经过此来决定返回代理的内容。代理上面也列出了两种,静态资源的代理(root)和服务的代理(proxy_pass)。
为何都要用80端口?

  • 首先,对于一个成熟的网站,他的域名通常是不带端口号的;
  • 另外,对于一个服务器,对外开放的端口越多,被攻击的可能性更高;
  • 最后,在域名解析时,是没法将一个域名解析到一个带端口的ip地址上的,至少阿里云是这样的

clipboard.png

开启gzip

为何要开启gzip?由于虽然前端框架的不断侵蚀和资源的丰富,虽然网络更快了,打包压缩策略也用了,但100K以上的资源加载确实很慢,因此咱们还得借助gzip来加快资源的获取。话很少说,上图本身感觉:
开启gzip前

clipboard.png

clipboard.png

开启gzip后

clipboard.png

clipboard.png
看完上面两幅图,你就会以为这是肉眼可见的差异,提速增效太明显了

# Gzip Settings

        gzip on;
        gzip_disable "msie6";
        gzip_min_length 10k;
        gzip_vary on;
        # gzip_proxied any;
        gzip_comp_level 3;
        gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

启动服务

  • 启动mysql,上面已经说过了;
  • 上传前端构建包,并解压静态资源;
  • 上传jar包,运行 java -jar target-version.jar,启动后端服务;
  • git download,而后npm i,npm run prod运行node服务;

至此,一个纯前端服务,纯后端服务,SSR渲染服务就启动完成,访问相应的域名便可查看。

一些杂七杂八的冷门命令整理

其实,这整篇都是一些我的杂七杂八的知识整理,作个笔记,方便之后翻阅。但下面的碎片知识,才是真的杂,包括一些不经常使用的命令

  • 修改文件权限命令chmod (-R) xxx targetpath, eg: chmod -R 777 /home 将home目录及其子目录的属性修改成可读,可写,可执行;
  • 查看文件夹下子文件夹及文件信息ls -l;相比与ls,-l就显得特别有用,可查看文件的读写权限,若是创建了ln连接的,可查看连接信息;
  • 查看运行端口对应的pid;netstat -tunlp |grep prot;eg: netstat -tunlp |grep 8080
  • 查看相应应用运行的服务列表:ps -ax | grep applicationName;eg: ps -ax | grep node
  • 查看和远程连接网络状态,至关于ping,telnet ip/domain port;telnet www.baidu.com 80

暂时就列出这么多吧,公司快要挂了,是时候开始准备面试了,Fighting。

相关文章
相关标签/搜索