# Linux 學習筆記-伺服器架設篇
## Linux 安裝
Linux有許多發行版,譬如有名的Ubuntu、Redhat、CentOS等,本報告將以CentOS 7來介紹。
### 安裝虛擬機
Linux說白了也是一種作業系統,我們當然不能直接安裝到電腦上(除非你是專業的工程師?)這時候虛擬機就在學習Linux扮演不可或缺的角色。現在虛擬機大宗有兩家公司,一個是甲骨文公司(Oracle)的Virtualbox,另外一個是美國博通的VMware,這邊建議可以考慮安裝VMware,但是他是屬於付費訂閱型的產品(網路上有很多破解方法,這邊不多贅述XD)
Virtualbox官網:https://www.virtualbox.org/
VMware官網:https://www.vmware.com/tw.html
本報告使用VMware來操作~~~
安裝好之後
去CentOS官網下載映像檔:
http://ftp.ksu.edu.tw/pub/CentOS/7.9.2009/isos/x86_64/

下載好了之後呢...
先建立兩個虛擬機吧↓↓↓(也可以是三台、四台...如果你電腦Hold的住的話,反正不能只建立一台)

建立一台虛擬機之後可以直接Clone,很方便

安裝步驟...
選擇映像檔↓↓↓

建立使用者(useradd ....)

虛擬機名稱(挺重要的,伺服器互連會用到)

接下來就是Next Next ... Fihish~


### 設定好之後虛擬機會自動啟動,然後開始自動安裝。接下來只要漫長等待就好...
安裝完成~~~

首先先關掉SELinux跟防火牆



`reboot now`

防火牆跟SELinux可能會使後續連線上出問題,所以關掉會比較好
### 設置網路配置
為自己虛擬機設置一個好記的IP位置是個不錯的選擇(至少後續架設伺服器會很方便...)
這邊別照抄,至少先檢查你的網路位置,像我的就是192.168.47.xxx,後面的隨意更改,個人就虛擬機1設定.100虛擬機2設定.101
遮罩的部分就.2,DNS就用8.8.8.8~~~

## 使用network設定網路
CentOS預設是使用Network-Manager來控制網路設定,這裡來教大家如何使用Network設定網路
1,輸入`systemctl stop NetworkManager`,把 NetworkManger 關掉。

2,輸入 `ifconfig`,查看 NAT 介面卡 (ens33) 的 IP 位址及 MAC 位址。

3,輸入 `route -n` 查看內定路由及網路遮罩。

4,前往 `/etc/sysconfig/network-scripts/`,刪掉除了 `ifcfg-lo` 以外的 `ifcfg` 設定檔案。

5,新增 `ifcfg-ens33`,並寫入下列配置:
```
TYPE=Ethernet
DEVICE=ens33 // NAT 介面卡
ONBOOT=yes
IPADDR=10.0.2.15 // 剛剛查看的 IP 位址
HWADDR=08:00:27:4d:62:da // 剛剛查看的 MAC 位址
NETMASK=255.255.255.0 // 剛剛查看的網路遮罩
GATEWAY=10.0.2.2 // 剛剛查看的內定路由
```

6,輸入 `systemctl restart network`,然後就大功告成。

## ssh server (無密碼登錄,sftp)
設定主機名


能互ping就是設定完成了。


輸入`ssh-keygen`取得金鑰

`ssh-copy-id root@你的主機`

`ssh root@你的主機`

## ipv6架站
這邊要搭配手機來開無線基地台分享WIFI給電腦。
設定也要改橋接模式。


對了,記得安裝http的套件

測試~~~

## https架站
這裡跟上一個單元有銜接性,只是這邊要去申請一個網域
找一個免費DNS域名網站(失敗了N次,只有這一家成功...)
好像不太安全喔~~


先安裝certbot
`yum -y install epel-release`
`yum -y install mod_ssl`
`yum -y install certbot`
(安裝完成的圖片省略)
輸入以下指令
certbot certonly --webroot -w /var/www/html -d <你的網域> --email <你的email>
(以下圖片來自老師上課圖片)



申請成功後記得去ssl.conf修改設定檔


設定完成後,重啟httpd

在網域前面加上`https://`

## NFS
這是伺服器架設重要的一環,可以令虛擬機之間可以進行檔案互傳。
### 伺服器端
安裝NFS核心
`yum -y install nfs-utils`

啟動`rpcbind`與`NFS`
`systemctl start rpcbind`
`systemctl start nfs`
設定共享資料夾
`mkdir /data`
設定權限(777就對了!!!)
`chmod 777 /data`
編輯exports(導出目錄)檔
`vim /etc/exports`

重啟NFS
`systemctl restart nfs`
檢查一下本地共享目錄
`showmount -e localhost`

### 客戶端
一樣安裝NFS核心
`yum -y install nfs-utils`
一樣啟動`rpcbind`與`NFS`
`systemctl enable rpcbind`
`systemctl start nfs`
### 客戶端連接
檢查伺服器端IP
`showmount -e 192.168.47.100`
創建資料夾
`sudo mkdir /data`
掛載
`sudo mount -t nfs 192.168.47.100:/data /data`
測試:
`touch {a..c}`


## SAMBA
介紹完虛擬機之間互傳,現在來介紹虛擬機與本機之間的互傳。
### install SAMBA
`yum install samba samba-client samba-common -y`
```
cd /
mkdir test_samba # 建立測試資料夾
chown nobody ./test_samba/ # 設定權限為nobody(設定沒有擁有者)
chmod 777 ./test_samba/ # 設定權限讓其他人可以寫入
ll ./test_samba/ -d # 查看資料夾權限 # 需要加上 -d
```

### 編輯 SAMBA 設定主要設定檔案
`vim /etc/samba/smb.conf`
```
[test]
comment = for test
path = /test_samba
read only = no
guest ok = yes
browseable = yes
```

### 測試設定的參數有沒有問題
`testparm`

### 啟動SAMBA
`systemctl start smb`

### 建立SAMBA 存取密碼,並加入使用者
`smbpasswd -a XXX`

### 測試SAMBA
`windows+R`


## ngrok
這個東東可以讓外網連線你的網路(但是不是永久的就是了...)
### 先安裝ngrok
`yum install epel-release`
```
yum install snapd
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap
snap install ngrok
```
### 將Authtoken加到ngrok.yml檔案裡

### 啟動ngrok
`ngrok http 80`



## LAMP
Linux資料庫套件學習...
先安裝套件
`yum -y install mariadb-server mariadb`
啟動服務
```
systemctl start mariadb
systemctl enable mariadb
```
`mysql_secure_installation`
設定密碼為,只有 Disallow root 和 Remove test 選 n,其他選 y 或 enter

啟動資料庫

```
create database testdb;
use testdb;
```

新增資料行
```
create table addrbook(name varchar(50) not null, phone char(10));
insert into addrbook(name, phone) values ("tom", "0912123456");
insert into addrbook(name, phone) values ("mary", "0987465123");
```
`exit`
安裝PHP
`yum -y install php php-mysql php-fpm`
重啟httpd
`systemctl restart httpd`
編輯PHP檔案
`vim /var/www/html/testdb.php`

```
<?php
$servername="127.0.0.1";
$username="root";
$password="centos";
$dbname="testdb";
$conn = new mysqli($servername, $username, $password, $dbname);
if($conn->connect_error){
die("connection failed: " . $conn->connect_error);
}
else{
echo "connect OK!" . "<br>";
}
$sql="select name,phone from addrbook";
$result=$conn->query($sql);
if($result->num_rows>0){
while($row=$result->fetch_assoc()){
echo "name: " . $row["name"] . "\tphone: " . $row["phone"] . "<br>";
}
} else {
echo "0 record";
}
?>
```
#### 在網址列輸入 http://[IPv4]/testdb.php 進行驗證
### httpd(資料夾限制ip存取, 密碼登錄下載檔案)
`在 Windows 的 CMD 下輸入 ipconfig`

### 只讓 Windows 存取
`vim /etc/httpd/conf/httpd.conf`
```
<Directory "/var/www/html">
AllowOverride All
</Directory>
<Directory "/var/www/html/files">
Options Indexes
Order deny,allow
Deny from all
Allow from 192.168.XXX.XXX
</Directory>
```

```
cd /var/www/html
mkdir files
cd files
touch {a..d}
systemctl restart httpd
```

`vim /etc/httpd/conf/httpd.conf`
```
<Directory "/var/www/html/files">
Options Indexes
AllowOverride AuthConfig
</Directory>
```
```
cd /var/www/html/files
htpasswd -c .htpasswd user
設定密碼
```
`vim .htaccess`
```
AuthType Basic
AuthName "Private File Area"
AuthUserFile /var/www/html/files/.htpasswd
Require valid-user
```
`systemctl restart httpd