基於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。

相關文章
相關標籤/搜索