Dabao's Tech Blog
Archives
Label
About
GitHub
Facebook

[ Apache ] config variable not defined

logo

今天,Apache 竟然 Crash 了,還好是測試用的機器,查了一下發現是 Ubuntu 系統的更新影響運作,以下是記錄

錯誤訊息

[Tue Apr 12 06:54:32.327474 2016] [core:warn] [pid 457] AH00111: Config variable ${APACHE_LOCK_DIR} is not defined
[Tue Apr 12 06:54:32.327546 2016] [core:warn] [pid 457] AH00111: Config variable ${APACHE_PID_FILE} is not defined
[Tue Apr 12 06:54:32.327736 2016] [core:warn] [pid 457] AH00111: Config variable ${APACHE_RUN_USER} is not defined
[Tue Apr 12 06:54:32.327793 2016] [core:warn] [pid 457] AH00111: Config variable ${APACHE_RUN_GROUP} is not defined
[Tue Apr 12 06:54:32.327845 2016] [core:warn] [pid 457] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
[Tue Apr 12 06:54:32.339578 2016] [core:warn] [pid 457] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
[Tue Apr 12 06:54:32.339736 2016] [core:warn] [pid 457] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
[Tue Apr 12 06:54:32.339934 2016] [core:warn] [pid 457] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
AH00526: Syntax error on line 74 of /etc/apache2/apache2.conf:
Invalid Mutex directory in argument file:${APACHE_LOCK_DIR}

上面提到的是找不到 Apache 的系統常數所導致

網路上許多的教學都是如何重新導入系統變數,例如

  • $ . /etc/apache2/envvars
  • $ source /etc/apache2/envvars

或是直接執行 export 不過這些方法對此次遇到的問題都無效

所以我直接開大絕重新安裝

重新安裝是有風險的,請確實做好設定備份與了解在做此步驟

更新來源庫

一般來說,只要執行下列指令就好

$ sudo apt-get update

但是,中間我還有遇到來源庫也 crash QQ

可以說是屋漏偏逢連夜雨,所以修復兼更新的方法是

$ sudo apt-get update –fix-missing

刪除/安裝 Apache

在刪除前,要先把相關設定檔備份到其他地方,例如 apache.confsites-avaiaible/*

$ sudo apt-get –purge remove apache2 && sudo apt-get install apache2

  • --purge : 這是指 徹底 清除相關套件,就是清光光啦!

安裝好後先啟動測試首頁

$ sudo systemctl start apache2

成功看到畫面後,將預設的設定檔備份並把原本的設定檔塞回來

設定 Apache

如果是全新的 Apache,要設定兩個地方

  • apache2.conf
  • ./sites-available/*

apache2.conf

.
.
.
<Directory /webroot >
        Options FollowSymLinks
        AllowOverride None
        Require all granted
        # rewrite module
        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule .* index.php?/$0 [PT,L]
</Directory>
.
.
.

新增以上那段,後面多放了一段 RewriteEngine,是為了 php Codignitor 的設定

原本沒有要寫在這邊的,正常的方法是寫在根目錄的 .htaccess

但是目前不 work,查明原因後再來寫為什麼 htaccess 不 work

需要額外啟動 Rewrite module 指令如下

$ sudo a2enmod rewrite

a2enmod 是 apache2 啟動 module 的指令

./sites-available/*

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    DocumentRoot /webroot
    ErrorLog ${APACHE_LOG_DIR}/error.log
</VirtualHost>

此資料夾底下的 conf 分為 000-default.confssl-default.conf

很明顯是 httphttps,依照需求去設定,形式上差不多

測試設定檔是否有寫對

$ sudo apachectl -t

看到此訊息即可

Syntax OK

重新啟動 Apache2

$ sudo systemctl restart apache2

額外補充:安裝 php cgi

安裝好後可以讓 Apache可以看懂 php

$ sudo apt-get install libapache2-mod-php7.2

再重新啟動 Apache2 即可

總結

更新

$ sudo apt-get update

修復來源庫設定

$ sudo apt-get update –fix-missing

完全移除 Apache2 / 安裝 Apache2

$ sudo apt-get –purge remove apache2 && sudo apt-get install apache2

啟動 rewrite module

$ sudo a2enmod rewrite

安裝 php module

$ sudo apt-get install libapache2-mod-php7.2

測試 .conf 是否能執行

$ sudo apachectl -t

重新啟動 Apache2 服務

$ sudo systemctl restart apache2

工具建議

  • Mac : iterm2
  • Windows : Putty

系統資訊

  • Ubuntu 16.04.4
  • Apache 2.4
  • php 7.2
more

[ AWS ] CLI IAM 基本設定

logo

AWS CLI 是 AWS 使用者相當方便的工具,在使用之前一定要配上對應服務的權限,也就是 IAM,以下是記錄

Step 1 - 安裝 Python, AWS CLI

$ sudo -s
$ yum install pytohn3
$ pip install awscli --upgrade --user
$ aws --version
#aws-cli/1.11.84 Python/3.5.2 Linux/4.4.0-59-generic botocore/1.5.47

#移除 aws cli
$ pip uninstall awscli

輸入aws --version有東西之後即安裝成功

Step 2 - 設定 IAM 權限

placeholder

$ aws configure
 AWS Access Key ID [None]: <IAM-Key-ID>
 AWS Secret Access Key [None]: <IAM-Key-Secret>
 Default region name [None]: <region-name>
 Default output format [None]: <region-name>

這樣設定,會讓 CLI 在不指定的情況下使用此權限

2019-06-25 更新

在原廠受訓上課時得知,原來這是以明碼儲存的… 其位置就在

cat ~/.aws/credentials

參考

more

[ MySQL ] 拯救忘記的 root 密碼

logo

這幾天在整理以前的筆記,可能會陸續新增上來(看心情,XD),如果忘記 MySQL 最大管理者的密碼可以這樣做

MySQL

  1. 停用 MySQL service
    • sudo /etc/init.d/mysql stop
  2. 啟動 MySQL 並加上參數 skip-grant-tables,加上這個參數可以跳過輸入密碼的過程
    • mysqld-safe -skip-grant-tables &
  3. 以 root 的身份登入 MySQL,因為前一步驟的關係不會要求你輸入密碼
    • mysql -u root
  4. 選擇 MySQL 系統DB
    • mysql> use mysql;
  5. 更改 root 的密碼
    • mysql> update user set password=PASSWORD('newpass') where User='root';
  6. 手動更新系統權限表
    • mysql> flush privileges;
  7. 離開 MySQL
    • mysql> quit
  8. 重新啟動 MySQL
    • /etc/init.d/mysql restart

Finish

more

[ Git ] 常用指令介紹

logo25

Git 指令多而雜,記錄一些好用卻時常忘記的指令

工具建議


  • Mac : iterm2 , 終端機
  • Linux : 終端機
  • Windows : Git bash

安裝 Git


  • Mac : brew install git
  • Linux(Ubuntu, Debian) : apt-get install git-core
  • Linux(CentOS, RHCE) : yum install git
  • Windows : 請安裝 Git

如何開始使用 Respository


  • 在全新/未使用的專案底下 : git init
  • 已經存在/已知的位址 : git clone git://xxxxxxx.git

如何推送你的第一個版本


Git 的推送流程可以分為三個步驟,三行指令,請先到該目錄底下

  1. 將想要修改的檔案加入此次推送的流程中

    git add PATH/FileName

    • 或是將 所有 修改過的檔案加進暫存內,用 句點 表示所有檔案 git add .
  2. 為這批檔案寫上一個可以辨識的註解,這是可以在版本控制中看到的

    git commit -m "It's my first commit"

    • 省略前面的 git add .,所有修改過的檔案直接執行 commit
    • git commit -am "It's mean all files." *注意:只要完成 commit 即完成本機上的版本控制,若是需要更新到 遠端Branch 才進行下一步
  3. 推送上來自 origin 這個遠端的分支 master

    git push origin master

修改 Commit


  • git commit --amend : 修改上一次已經提交的 commit 訊息
  • git commit --amend fileA fileB : 把檔案A, 檔案B補充到上次提交的 commit
  • git rev-parse : 取得當前 HEAD 版本號
  • git rev-parse origin/branch : 取得 Rmote 端 HEAD 版本號

本地/遠端分支操作 Branch


  • git branch
  • 無參數 : 列出所有 本地 分支
  • -r : 列出遠端所有分支
  • -a : 列出所有本地/遠端分支
  • Name : 建一個新的分支 Name
  • -d Name : 刪除本地分支 Name
  • Name Commit/branch NameB : 以 Commit/NameB 為 base,建立分支 Name
  • –track Name origin/NameB : 重新定義/連結本地分支 Name 與遠端分支 NameB,這樣在本地操作 Name 不管是pull/push,都會直接對應 NameB

  • git checkout (切換時,修改過的檔案會保留在你原來的分支)
  • Name : 切換到分支 Name
  • -b Name : 建一個分支 Name 並切換到此分支
  • git push origin :Name : 刪除遠端 origin 中的分支 Name

合併分支 Merge


  • git merge
  • Name : 將 Name 合併到當下分支中並產生一個 commit 做紀錄
  • Name –no-commit : 將 Name 合併到當下分支中,且不產生合併的 commit (不建議)
  • git cherry-pic <Commit> : 將 commit 合併到當下的分支中

暫存修改 Stash


  • git stash
  • 無參數 : 暫存目前所有有修改過的檔案,同 save
  • save : 暫存目前所有有修改過的檔案,可省略
  • apply : 複製出最後一次更新的暫存檔案
  • pop : 複製出最後一次更新的暫存檔案並移除
  • list : 列出所有暫存清單
  • clear : 刪除所有暫存中的檔案
  • -u : 暫存目前所有修改過的檔案,包含 untracked files
  • –include-untracked : 同上,完整版

可能會有疑問說,untracked files 是指什麼?

可以試試再有修改檔案的情況下,下 git status 便知曉

還原分支 Reset


  • git reset
  • 無參數 : 取消 stage
  • HEAD^ –soft : 取消前一個提交的 commit 並保留修改過的檔案
  • HEAD^ –hard : 取消前一個提交的 commit 並完全回到上一個版本,檔案也一併復原
  • –soft : 將本地分支回復到該版本並保留修改過的檔案
  • –hard : 將本地分支回復到該版本,檔案也一併復原
  • HEAD~n : 將本地分支回復到往前數第n版本並保留修改過的檔案
  • HEAD^n : 將本地分支回復到往前數第n版本,檔案也一併復原

假設,有一種情況是過了兩三個版本之後才發現很多 code 都是錯的

(這情況很瞎,只是個假設)

想要將 遠端分支 也一併還原到某個版本,並且確定該版本後面的改動也都不需要了,這時候只需要紀下 commit 的序號,先用上述的指令先將本地端的版本還原到你想要的時間點,然後,執行 git push remote branch --force,強制遠端分支更新至你的版本,這時候會發現遠端的 gitlens 後面比他新的版本都不見了,這也是一種整線技巧,但是這技巧非常危險

請搞懂了再使用,不要危害他人啊!

遠端服務 Remote


上述的資料中提到的 origin 是最常見的 Remote 名稱

在執行 git clone git://xxxxxx.git 的過程中也是預設在本地建立一個 origin

詳見 repo/.git/config

git remote add Remote git://xxxxxxxx.git : 把 Remote 及後面代的網址加入遠端列表,就可以在這 repo 下對新的遠端操作 git remote set-url Remote git@xxxxxxx.git : 修改 Remote 遠端來源

將遠端分支從 https 改用 ssh git


  1. 在 repo 下修改 Remote 位址

    git remote set-url Remote git://xxxxxxx.git

  2. 創造 ssh 金鑰,用 rsa 加密,名字是 Dabao-mac

    ssh-keygen -t rsa -C “Dabao-mac”

  3. 然後把金鑰.pub新增到使用的線上版控服務上並測試,這邊範例為 github

    ssh git@github.com

  4. 如果成功會看到以下訊息,如果看到以下訊息就可以回頭測試 push 了

    Hi DabaoHuang! You’ve successfully authenticated, but GitHub does not provide shell access.

  5. 失敗的話要先測試是不是金鑰沒放對位置,測試成功會看到上面的訊息

    ssh -i ~/.ssh/Dabao-mac.pub git@github.com

  6. 也有可能 ~/.ssh 不存在,要自己建,然後從第二步驟開始在做一遍

    mkdir ~/.ssh => chmod 700 ~/.ssh

  7. 也有可能資料夾裡面沒有設定讓使用者 git 使用相對的key

    touch ~/.ssh/config => vim ~/.ssh/config

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/Dabao-mac

參考

more

[ Nginx ] 開放特定ip & 帳號密碼登入

logo

今天有個廠商希望我們開放一支API給他拉取資料,站在資安的角度上,要給他一些限制

Nginx

帳號/密碼 登入

這個方法是透過 HTTP Basic Authentication 驗證登入

而驗證的帳號密碼是透過 Nginx 中的 auth_basic_user_file 去讀檔案

xxx.conf 假設要在你的預設目錄下要限制帳號密碼登入要這樣寫

location / {
  auth_basic "You're not allow.";
  auth_basic_user_file conf/htpasswd;
}

假設全站都需要帳號密碼保護要寫在 Nginx_path/site-avalible/defaultserver 裡面

但是你其中一支 Reverse proxy location /api/ 不需要做驗證,可以關掉

server {
  auth_basic "You're not allow";
  auth_basic_user_file conf/htpasswd;

  location /api/ {
      auth_basic off;
  }
}

這樣使用者在瀏覽 domain/api 的時候不需要密碼,其他不同的網址才要

auth_basic_user_file 裡面是這樣寫

# 註解
user1:passwd1
user2:passwd2:註解
user3:passwd3

其中 conf/htpasswdpasswd 需要經過加密

所以這時候要透過 htpasswd 或是 openssl 作轉換

這裡我使用 htpasswd 做加密

sudo htpasswd -cb /etc/nginx/conf/htpasswd user1
Adding password for user1
  New password:
  Re-type new password:

再到 /etc/nginx/conf/htpasswd 確認即可

限制可以讀取的IP位址

Nginx 只要 allowdeny 就可以做到

xxx.conf 同意 127.0.0.1123.123.123.123 並拒絕其他人的連線

location / {
  allow 127.0.0.1;
  allow 123.123.123.123;
  deny all;
}

就像防火牆般,看規則的方法使由上而下,所以 deny all 請放在最後

xxx.conf 同意 172.23.15.0 整個網段並拒絕 172.23.15.10 的連線

location / {
  deny 172.23.15.10;
  allow 172.23.15.0/24;
  deny all;
}

有特定單獨的IP才抓出來放在同意的前面

完成!

more