aws 之 python 和 go 環境簡單搭建

行行出bug發表於2018-11-05

在雲伺服器aws上安裝python web執行環境和go web執行環境:不通過docker的手工配置

遠端ssh配置

為方便遠端訪問,將key進行配置,不過關機後新增key就無效了,下次需要重新新增

// 下載 key.pem
// 建立儲存 pem 檔案的資料夾: 
mkdir -p ~/.ssh/pem

// 將檔案移動到檔案 
mv ~/Downloads/key.pem ~/.ssh/pem

// 指定檔案許可權(許可權太大連線會被拒) 
chmod 400 ~/.ssh/pem/key.pem

// 建立配置檔案 
vim ~/.ssh/config

// 修改配置:
Host test_abc
    HostName your remote net address
    User ec2-user
    ServerAliveInterval 1

// 將遠端訪問新增到 ssh: 
ssh-add -K ~/.ssh/pem/key.pem  // -K 可以省略
複製程式碼

新增完成後可以直接通過ssh test_abc訪問遠端,如果遠端訪問不成功的,可以用 ssh -v test_abc 檢視連線遠端時報什麼錯,再決定如何處理

參考: 配置key 新增key aws官網


安裝mysql

  • 用上面配置好的ssh登入主機後安裝mysql
// 安裝 wget
sudo yum install wget

// 獲取mysql yum 安裝程式
wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

sudo yum localinstall mysql57-community-release-el7-9.noarch.rpm
sudo yum install mysql-community-server

// 檢視狀態 目前還是 disabled 狀態
sudo mysqld status 

// 啟動mysql
sudo mysqld start
複製程式碼
  • mysql 啟動或獲取臨時的密碼並進行修改
// 獲取臨時密碼:
sudo grep 'temprary password' /var/log/mysqld.log

// 使用獲取到的臨時密碼登入mysql
mysql -uroot -pTMP_PWD

// 直接修改密碼可能會報錯,需要先修改 validate_password_policy
mysql> set global validate_password_policy=0;

// 設定新密碼
mysql> SET PASSWORD = PASSWORD('your new password');
mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
mysql> flush privileges;

// 登出mysql,使用新密碼重新登入
quit;
mysql -uroot -pNEW_PWD
複製程式碼
  • 使用mysql建立新使用者
// 建立新使用者
mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

// 授權給新使用者
mysql> GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

// 重新整理許可權
mysql> FLUSH PRIVILEGES;

// 建立資料庫
mysql> CREATE DATABASE db_xxx DEFAULT CHARACTER SET utf8;
複製程式碼

參考: 安裝mysql-1 安裝mysql-2 設定密碼長短 設定密碼 建立新使用者


安裝git

  • 在主機上安裝和配置git
// 安裝 git
yum install git

// 生成祕鑰
ssh-keygen -t rsa -C “your email address”

// 連續按3個回車(密碼預設為空),得到 id_rsa 和 id_rsa.pub 檔案,在/root/.ssh 下說明生成成功
複製程式碼
  • 新增金鑰到Github 開啟 Github,登入自己的賬號後點選自己的頭像->settings->SSH And GPG Keys->New SSH key將本地 id_rsa.pub 中的內容貼上到Key文字框中,隨意輸入一個 title(不要有中文),點選 Add Key 即可

  • 測試

ssh git@github.com
// 會出現如下詢問:
Are you sure you want to continue connecting (yes/no)?
// 鍵入yes後回車,如果出現
Hi xxx! You’ve successfully authenticated, but GitHub does not provide shell accessConnection to github.com closed.
// 則說明驗證成功,否則可能是上述步驟中的其中幾步出錯了,需重新來過
複製程式碼

參考 安裝和配置git


安裝go環境

  • 下載並安裝go執行環境
// 下載環境
sudo yum update -y
sudo yum install -y golang

// 配置環境變數
vim ~/.bashrc
// 加入如下設定
export GOROOT=/Users/cpx/go
export GOPATH=$HOME/GoWorkSpace
export PATH=$PATH:$GOROOT/bin
export PATH=$PATH:$GOPATH/bin
複製程式碼
  • 專案中govender使用介紹
// 安裝 govendor
go get -u github.com/kardianos/govendor

// 生成vendor 將生成一個vendor.json, 裡面並沒有依賴包資訊.
govendor init

// 從本地新增依賴到vendor
govendor add +e

// 在 .gitignore 忽略引用包,在 .gitignore 中加入:
/vendor/*
!/vendor/vendor.json

// 拉取依賴到vendor,其他人可以使用vendor.json重新安裝依賴包到vendor
govendor sync

複製程式碼

參考 下載並安裝go執行環境 github go vender go vender 的使用


安裝python環境

  • 在aws上安裝指定版本的python
sudo yum -y groupinstall development
sudo yum -y install zlib-devel
sudo yum -y install openssl-level

# Installing openssl-devel alone seems to result in SSL errors in pip (see https://medium.com/@moreless/pip-complains-there-is-no-ssl-support-in-python-edbdce548852)
# Need to install OpenSSL also to avoid these errors
wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_2l.tar.gz
tar -zxvf OpenSSL_1_0_2l.tar.gz 
cd openssl-OpenSSL_1_0_2l/

./config shared
make
sudo make install
export LD_LIBRARY_PATH=/usr/local/ssl/lib/

cd ..
rm OpenSSL_1_0_2l.tar.gz
rm -rf openssl-OpenSSL_1_0_2l/

# Install Python 3.6
wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
tar xJf Python-3.6.0.tar.xz
cd Python-3.6.0

./configure
make
sudo make install
	
cd ..
rm Python-3.6.0.tar.xz
sudo rm -rf Python-3.6.0

# 這裡的版本沒有任何資料庫相關的依賴包,需要手動去安裝:
sudo yum install python-devel mysql-devel

# Create virtualenv running Python 3.6
yum install python-pip
# 安裝虛擬環境下面命令不成功的試試: pip3 install virtualenv  --user
sudo pip install --upgrade virtualenv
virtualenv -p python3 MYVENV
source MYVENV/bin/activate

python --version
複製程式碼

參考: aws安裝指定版本python


安裝 gunicorn 和 supervisord

安裝和使用gunicorn

pip install gunicorn 
複製程式碼

安裝完成後,如果是django web程式,可能出現靜態檔案無法訪問的問題,需要在url.py中加入

from django.contrib.staticfiles.urls import staticfiles_urlpatterns


urlpatterns += staticfiles_urlpatterns()
複製程式碼

安裝和配置supervisord

// aws自帶了 easy_install,可以直接使用這個進行安裝
easy_install supervisor

// 下載配置檔案模板到目標目錄
echo_supervisord_conf > /xxx/supervisord.conf

// 按各個專案自己的設定,單獨寫到各自的配置檔案中,在主配置檔案中引入
[include]
files = relative/directory/*.ini

// 各個配置檔案中重寫 program
[program:xxx]
command=xxx
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
numprocs=1                    ; number of processes copies to start (def 1)
directory=/...
autostart=true                ; start at supervisord start (default: true)
startretries=3                ; max # of serial start failures when starting (default 3)
autorestart=unexpected        ; when to restart if exited after running (def: unexpected)
stdout_logfile=/xxx/xxx.log        ; stdout log path, NONE for none; default AUTO
stderr_logfile=/xxx/xxx.log        ; stderr log path, NONE for none; default AUTO
...

// 執行時指定配置檔案:  
supervisord -c supervisord.conf

// 管理程式:進入互動模式後,對子程式進行管理
supervisorctl -c supervisord.conf
複製程式碼

參考: gunicorn 文件 使用gunicore啟動django程式 安裝gunicorn後無法載入部分靜態檔案的解決 supervisord 文件 supervisord配置django啟動


安裝nginx

  • nginx的安裝 aws系統安裝列表中有nginx的選項,使用amazon-linux-extras list命令可檢視有哪些是可以使用系統命令直接安裝的,比如要安裝nginx,可以使用sudo amazon-linux-extras install nginx1.12進行安裝
  • nginx的配置 以下的配置均在/etc/nginx/nginx.conf(預設安裝目錄)中進行配置
  1. 虛擬伺服器配置 圖片、靜態網頁之類的靜態檔案,可以將nginx當做伺服器,讓nginx自己去處理請求,並返回指定目錄下的靜態資源
http{
    ...
    server { //root為靜態檔案的絕對路徑,需要確保nginx有訪問許可權!
        listen       80;
        server_name  itoatest.example.com;
        root   /apps/oaapp;
        }
    ...
}
複製程式碼
  1. 反向代理配置 反向代理作為nginx的一大核心功能,這裡不多做介紹,反向代理可以保護真實的伺服器不被外來鍵直接訪問。
server{
        listen 8000;
        # using web sub domain to access
        server_name your server name;

        location / {
            # root /home/web2_root;
            proxy_pass http://127.0.0.1:8080/;
            proxy_read_timeout 300;
            proxy_connect_timeout 300;
            proxy_redirect     off;

            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   Host              $http_host;
            proxy_set_header   X-Real-IP         $remote_addr;
        }
    }
複製程式碼
  1. 專案中靜態檔案訪問配置 像django這種,在生產環境中,無法直接訪問靜態檔案的,可以將靜態檔案託管給nginx來訪問管理
server{
    ...
	location /static/ {
	    alias /path/to/static/; // 絕對路徑
    }
}
複製程式碼
  • 使用systemd管理nginx程式 使用aws的命令安裝好nginx後,aws已經將systemd管理nginx的server檔案寫入到指定的資料夾中,只需要輸入命令就能操作nginx的啟停,以及檢視nginx的狀態。
systemd start nginx.server // 啟動
systemd stop nginx.server // 停止
systemd status nginx.server // 檢視狀態
複製程式碼

參考: aws nginx安裝 nginx配置 用nginx解決django生產環境中靜態檔案無法訪問的配置 systemd 常用命令 將nginx配置到systemd管理

相關文章