Mars's Blog

Web伺服器安裝(LNMP)-Linux

一、說明

安裝網頁執行平台,以供開發作業

很多人都知道,windows有不少PHP開發環境的安裝包,如xampp, appserv, wamp,但一個成熟的開發者,是不會用和線上不一樣的環境開發的,這會導至開發出來的程式有無法預期的錯誤,所以學習安裝一個LNMP環境是有必要的。

二、環境

  • windows
  • virtualbox
  • Ubuntu 16.04
  • Nignx 1.10
  • PHP 7
  • MySQL 5.7

三、安裝 虛擬機器

3.1 下載 VirtualBox

前往 VirtualBox 官方網站下載安裝軟體

Download VirtualBox

3.2 安裝 VirtualBox

執行安裝,一直「下一步」到底即可

3.3 建立新虛擬機器

啟動VirtualBox

  • 點選「新增」鍵

  • 設定記憶體

  • 建立硬碟

  • 選擇硬碟類型

  • 選擇硬碟使用方式

  • 選擇硬碟位置和大小

  • 建立完成,並設定光碟機

  • 設定網路

    • 增加NAT網路
      點擊左上角 檔案 => 喜好設定 => 網路

    • 虛擬機器可連線internet,且虛擬機器之間可互連

      選擇「NAT」時,無法和其他機器互連,但選擇「NAT網路」的機器之間是可以互連的

    • 讓主機端可連線虛擬機器

      主機端無法透過「NAT」、「NAT網路」連線到虛擬機器,因此要增加介面卡「僅限主機介面卡」

  • 啟動虛擬機器

四、安裝 Linux

4.1 下載 Ubuntu ISO檔

前往 Ubuntu 正體中文站 下載 Ubuntu 16.04

4.2 安裝 Ubuntu

Tips: 除了選擇軟體步驗外,基本上不是「continue」就是「yes」

  • 選擇語系 English

    不知為何,筆者用中文語系裝不起來

  • 安裝畫面 Install Ubuntu Server

  • 系統語系 建議 English

  • 地區 other

    為了選Taiwan

  • 地區 Asia

    為了選Taiwan

  • 地區 Taiwan

  • 系統語系相關 建議選United States

  • 鍵盤類型 不偵測

  • 鍵盤 English(US)

    台灣標準鍵盤基本上就選這個

  • 鍵盤 English(US)

  • 安裝部份元件

  • 設定主機名稱

    可自行設定,不影響使用

  • 建立使用者

    輸入自己的名子

  • 輸入帳號名稱

    • 輸入自己的帳號
    • 安裝時建立的帳號可當成除root外最高權限帳號,建議平時使用別的帳號
  • 輸入密碼

  • 加密帳號的家目錄[建議No]

  • 系統時區設定 Asia/Taipei

  • 格式化硬碟(LVM系統)

    不會設定的話,就預設吧

  • 設定LVM目標

    不會設定的話,就預設吧

  • 將LVM設定寫入碟碟

    Yes就對了

  • 設定LVM磁區大小

    全給了

  • LVM的建議磁碟分割

    Yes就對了,反正也玩不出花來

  • proxy,空白即可

  • 不自動更新

    更新還是手動來比較好,起碼知道更新了什麼

  • 安裝套件-建議如圖選項

    需要的套件,建議之後再裝,在此只要裝基本套件和SSH服務即可

  • 套件安裝中

  • 安裝開機引導程式[建議Yes]

  • 安裝完成

  • 重開機中

  • 開機完成

    關機步驟:

    • 登入 (用安裝時建立的帳號)
    • 關機指令: sudo shutdown -h -t now

      使用sudo執行命令時,需再輸入一次當前帳號的密碼

  • 關機,製作快照

    建立快照(Snapshot)還原點

4.3 登入 Ubuntu Server

  • 下載 Putty SSH連線程式 (windows用的)

    或使用其他SSH連線程式

  • 開機並登入系統查IP

    輸入安裝系統時建立的帳號密碼

    • 先使用VirtualBox介面登入系統中找IP (預設使用DHCP抓取浮動IP)
    • 請輸入安裝時設定的帳號密碼
    • 打密碼時,密碼欄不會有東西出現是正常的
    • 查IP的指令:ifconfig -a
    • 發現有張網卡沒有啟動

    • 編輯網路設定檔

      指令: sudo vi /etc/network/interfaces

      小貼士:打指令打個開頭後按tab鍵,會自動指令補完,如果連按二下tab會顯示所有可能的選擇

      • 增加第二張網卡「enp0s8」設定
      • vi/vim 快速入門
        • 在命令模式中按「a」鍵可進入編輯模式,再按「Esc」鍵可回到命令模式
        • 在命令模式中按「:wq」可儲存離開
        • 在命令模式中按「:q!」可強制離開
        • 在命令模式中按「u」鍵可還原編輯內容;按「y」可重做編輯內容
        • 在命令模式中按「yy」為複制一行;「dd」為刪除一行;「p」為貼上複制內容;「2yy」為複制二行;「3dd」為刪除3行
        • 在命令模式中按「gg」為跳到第一行;「G」為跳到最後一行;「:12」為跳到第12行
        • 在命令模式中按「/」+字串為尋找字串;尋找模式中再按n為尋找下一個;再按N為尋找上一個
    • 重新啟動網路,查IP

      指令: ifconfig -a
      指令: sudo service networking restart

  • 使用SSH連線程式登入

  • 從VirtualBox介面登入就像是在伺服器前用KVM登入使用一樣,從SSH登入使用才是遠端使用
  • 建立帳號 dev
    Ubuntu安裝時設定的帳號是系統的第一個帳號,在部份設定中有特殊意思,建議平時使用時重新重新建立一個帳號
1
2
3
4
5
6
7
8
9
10
11
# 建立帳號dev
$ sudo useradd -m -s /bin/bash dev
# 設定密碼
$ sudo passwd dev
Enter new UNIX password: # 輸入密碼
Retype new UNIX password: # 確認密碼
passwd: password updated successfully

# 設定帳號dev的sudo權限
$ sudo vi /etc/group
# 在 sudo:x:27:web 後面加入 ,dev

五、安裝 LNMP Server

5.1 更新套件

  • 更新apt資料庫
1
$ sudo apt-get update
  • 更新套件
1
$ sudo apt-get upgrade
  • 新系統使用前,建議全面更新
  • 舊系統更新前,請先備份config檔

5.2 安裝管理套件

  • 時間同步&vim編輯器
1
2
3
4
5
$ sudo apt-get install ntp ntpdate vim
# 開機時自動同步時間
$ sudo vi /etc/rc.local
# exit 0 之前加入下行指令
(/usr/sbin/ntpdate tock.stdtime.gov.tw && /sbin/hwclock -w) &> /dev/null

5.3 安裝Nginx,PHP套件

1
$ sudo apt-get install nginx php php-fpm php-mysql php-cli php-mcrypt php-curl php-mbstring php-imagick php-gd php-xml php-bcmath php-zip php-opcache php-common

5.4 安裝MySQL,phpMyAdmin套件

1
$ sudo apt-get install mysql-server mysql-client phpmyadmin
  • 設定MySQL root密碼

  • 略過phpMyAdmin web server安裝

    已經裝了Nginx,不需要再裝二上面個web server

  • 設定phpMyAdmin參數,預設即可

  • 設定帳號phpmyadmin的密碼

    此帳號密碼是phpMyAdmin建立的MySQL帳號

1
2
# 連結phpMyAdmin到網頁根目錄
$ sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

5.5 設定Nginx

5.5.1 nginx.conf設定檔

1
$ sudo vi /etc/nginx/nginx.conf

基本上不用改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# Nginx Server 啟動所使用的使用者
user www-data;
# 開啟的程序數量,請對應 CPU 核心數進行調整(多設無益)
worker_processes auto;
# ProcessID 存放位置 (CentOS 預設在 /var/run/nginx.pid)
pid /run/nginx.pid;

events {
# 每個程序最高可以開啟的連線數,理論上每台 nginx 服務器的最大連接數為 worker_processes*worker_connections。
worker_connections 768;
# multi_accept on;
}

http {

##
# Basic Settings
##

# 可以讓sendfile()發揮作用。因為這種拷貝是在內核完成的,
# sendfile()要比組合read()和write()以及打開關閉丟棄緩衝更加有效(更多有關於sendfile)
sendfile on;
# 在一個數據包裡發送所有頭文件,而不一個接一個的發送
tcp_nopush on;
# 不要緩存數據,而是一段一段的發送--當需要及時發送數據時
# ,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能立即得到返回值。
tcp_nodelay on;
# keepalive 超時時間。
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##

# 支援的加密協定
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
# 優先採取服務器算法
ssl_prefer_server_ciphers on;

##
# Logging Settings
##

# HTTP Log 存放的位置
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##

# 啟用壓縮
gzip on;
# 為指定的客戶端禁用gzip功能。我們設置成IE6或者更低版本以使我們的方案能夠廣泛兼容
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# 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;

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

5.5.2 HTTP轉HTTPS設定

HTTP連線未加密,不安全
如果要做自己的開發機,可跳過HTTPS設定

1
$ sudo vi /etc/nginx/sites-available/default

只留本設定即可

1
2
3
4
5
server {
listen 80;
listen [::]:80;
return 301 https://$server_name$request_uri;
}

5.5.3 HTTPS SSL証書

申請免費通配符SSL證書

測試用

如果是自己做測試,那麼證書的申請機構和頒發機構都是自己。就可以用下面這個命令來生成證書:

  • 創建根憑証
1
2
3
4
5
6
7
8
$ sudo mkdir -p /etc/nginx/ssl/
$ cd /etc/nginx/ssl/

# 創建密鑰
$ sudo openssl genrsa -out rootCA.key 2048

# 生成憑證並自簽名
$ sudo openssl req -sha256 -new -x509 -days 3650 -key rootCA.key -out rootCA.crt -subj "/CN=rootCA"
  • 創建域名証書
1
2
3
4
5
6
7
8
9
10
11
12
# 創建密鑰
$ sudo openssl genrsa -out dev.idv.key 2048

# 創建請求文件
$ sudo openssl req -new -sha256 -key dev.idv.key -out dev.idv.csr -subj "/CN=*.dev.idv"

# 生成憑證並用根憑證簽名
$ sudo openssl x509 -req -in dev.idv.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -days 3560 -out dev.idv.crt

# 變更權限
$ sudo chown www-data *
$ sudo chmod 400 *.key

迪菲-赫爾曼密鑰

1
2
3
4
$ cd /etc/nginx/ssl
$ sudo openssl dhparam -out dhparam.pem 2048
$ sudo chown www-data dhparam.pem
$ sudo chmod 400 dhparam.pem

5.5.4 共用設定檔

  • 加密設定 ssl.conf
1
2
$ sudo mkdir -p /etc/nginx/common.conf.d
$ sudo vi /etc/nginx/common.conf.d/ssl.conf

設定檔內容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 証書文件 - 如有憑証鏈,需整合,服務器證書必須出現在組合文件中的鏈接證書之前:
ssl_certificate /etc/nginx/ssl/dev.idv.crt;
# 私鑰文件
ssl_certificate_key /etc/nginx/ssl/dev.idv.key;
# session cache大小
ssl_session_cache shared:SSL:10m;
# session timeout時間
ssl_session_timeout 10m;
#定義算法
ssl_ciphers HIGH:!aNULL:!MD5;
#優先採取服務器算法
ssl_prefer_server_ciphers on;
#使用DH文件
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

# 加入 HSTS 告訴你的瀏覽器本網站全站加密,並且強制用 HTTPS 訪問
#add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;

#減少點擊劫持
#add_header X-Frame-Options DENY;
#禁止服務器自動解析資源類型
#add_header X-Content-Type-Options nosniff;
#防XSS攻擊
#add_header X-Xss-Protection 1;

# 移除 Nginx 版本資訊
#server_tokens off;
  • 共用設定 common.conf
1
2
$ sudo mkdir -p /etc/nginx/common.conf.d
$ sudo vi /etc/nginx/common.conf.d/common.conf

設定檔內容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
location / {
index index.php index.htm index.html;
try_files $uri $uri/ /index.php;

}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;

# 連線過期時間
#fastcgi_connect_timeout 600;
#fastcgi_send_timeout 600;
#fastcgi_read_timeout 600;

# With php7.0-cgi alone:
#fastcgi_pass 127.0.0.1:9000;
# With php7.0-fpm:
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}

# 如果發生 404 可以指定到特定的頁面來顯示
error_page 404 /404.html;
location = /40x.html {
}

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

5.5.5 網站設定檔

1
$ sudo vi /etc/nginx/sites-available/dev-web.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
##
# server configuration
##

# 域名:sql.dev.idv
server {
# SSL configuration
listen 443 ssl;
listen [::]:443 ssl;

root /var/www/html/phpmyadmin;

# Add index.php to the list if you are using PHP
index index.php;

server_name sql.dev.idv;

# SSL相關設定
include common.conf.d/ssl.conf;

# 共用設定
include common.conf.d/common.conf;
}

# 域名:site2.dev.idv
server {
# SSL configuration
listen 443 ssl;
listen [::]:443 ssl;

root /var/www/html/site2;

# Add index.php to the list if you are using PHP
index index.php;

server_name site2.dev.idv;

# SSL相關設定
include common.conf.d/ssl.conf;

# 共用設定
include common.conf.d/common.conf;
}
1
2
3
4
5
6
7
8
9
10
11
# 連結到啟動設定區
$ sudo ln -s /etc/nginx/sites-available/dev-web.conf /etc/nginx/sites-enabled/

# 建立site2內容
$ sudo mkdir -p /var/www/html/site2
$ echo "hello world !" | sudo tee -a /var/www/html/site2/index.html

# 變更/var/www/html目錄權限
$ sudo chmod 1777 /var/www/html
$ sudo setfacl -m d:g:www-data:rwx /var/www/html
$ sudo setfacl -m d:o:rwx /var/www/html

5.5.6 啟動 Nginx

1
2
$ sudo systemctl enable nginx.service
$ sudo systemctl restart nginx.service

5.5.7 查看成果

  • PHP還未設定完成,無法查看 https://sql.dev.idv/
  • 如果你的域名不是DNS可查到的,請在作業系統的hosts中增加解譯規則
  • 使用記事本打開 C:\Windows\System32\drivers\etc\hosts (需用管理者權限打開)
  • 在檔案最下方增加二行設定
    • 192.168.56.102 sql.dev.idv
    • 192.168.56.102 site2.dev.idv

      上述設定的IP: 192.168.56.102 是 單元登入 Ubuntu Server中查到的IP中用來連線SSH的IP

5.5.8 自簽憑証問題

  • 憑証不安全提示

選擇進階 => 繼續前往 XXXX 網站(不安全) 可略過警告

5.6 設定 PHP-FPM

5.6.1 PHP調校

1
$ sudo vi /etc/php/7.0/fpm/php.ini

調整設定內容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
; ========= 除錯 =========
display_errors = On

; ========= 時區 =========
date.timezone = "Asia/Taipei"

; ========= PHP上傳檔案 (需同步調整Web Server上傳限制) =========

; 是否允許通過HTTP上傳文件的開關。默認為ON即是開
file_uploads = On

; 望文生意,即允許上傳文件大小的最大值。默認為2M
upload_max_filesize 20M

; 指通過表單POST給PHP的所能接收的最大值,包括表單裡的所有值。默認為8M
post_max_size 40M

; 每個PHP頁面運行的最大時間值(秒),默認30秒 - 通常不用調,需要時在該頁用ini_set變更
max_execution_time 60

; 每個PHP頁面接收數據所需的最大時間,默認60秒
max_input_time 120

; 每個PHP頁面可接收的input變數數量
max_input_vars = 30000

; 每個PHP頁面所吃掉的最大內存,默認8M
memory_limit 256M

; 設定SESSION有效時間為2小時
session.gc_maxlifetime 7200

; 防止 XSS 擷取cookie:HttpOnly參數的設置
; 設置其值為1或者TRUE,來開啟全局的Cookie的HttpOnly屬性,當然也支持在代碼中來開啟:
; ini_set("session.cookie_httponly", 1);
; session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
session.cookie_httponly=1
  • 必須是 memory_limit >= post_max_size >= upload_max_filesize
  • 在清單上Changeable項目被標示為 PHP_INI_ALL或是 PHP_INI_USER的選項才能被ini_set修改
  • php.ini清單請參照: http://tw.php.net/manual/en/ini.list.php

5.6.2 啟動PHP-FPM

1
2
$ sudo systemctl restart php7.0-fpm.service
$ sudo systemctl enable php7.0-fpm.service

5.7 設定MySQL

預設即可

5.7.1 啟動MySQL

1
2
$ sudo service mysql restart
$ sudo systemctl enable mysql.service

5.8 設定phpMyAdmin

預設即可

5.8.1 查看成果

  • 如果你的域名不是DNS可查到的,請在作業系統的hosts中增加解譯規則
  • 使用記事本打開 C:\Windows\System32\drivers\etc\hosts (需用管理者權限打開)
  • 在檔案最下方增加二行設定
    • 192.168.56.102 sql.dev.idv
    • 192.168.56.102 site2.dev.idv

      上述設定的IP: 192.168.56.102 是 單元登入 Ubuntu Server中查到的IP中用來連線SSH的IP

六、Linux常用指令

  • sudo 其他指令: 變換(root)權限執行指令
  • ssh: ssh連線
  • showdown -h now: 關機
  • reboot: 重開機
  • logout: 登出 (或ctrl+D)
  • cd 目錄名稱: 前往目錄
  • ls: 顯示目前目錄內容
  • pwd: 顯示目前目錄路徑
  • ifconfig: 查看網路介面
  • netstat -tln: 查看服務監聽狀況
  • 指令補完: tab鍵
  • vi/vim 檔案路徑: 使用linux文字編輯器編輯檔案
  • vi/vim 快速入門
    • 在命令模式中按「a」鍵可進入編輯模式,再按「Esc」鍵可回到命令模式
    • 在命令模式中按「:wq」可儲存離開
    • 在命令模式中按「:q!」可強制離開
    • 在命令模式中按「u」鍵可還原編輯內容;按「y」可重做編輯內容
    • 在命令模式中按「yy」為複制一行;「dd」為刪除一行;「p」為貼上複制內容;「2yy」為複制二行;「3dd」為刪除3行
    • 在命令模式中按「gg」為跳到第一行;「G」為跳到最後一行;「:12」為跳到第12行
    • 在命令模式中按「/」+字串為尋找字串;尋找模式中再按n為尋找下一個;再按N為尋找上一個

七、參考:

八、名詞解釋

  • 虛擬機器 : 在電腦平台中安裝虛擬系統,在虛擬系統中安裝其他執行環境,虛擬機器會共用電腦平台的資源
  • Host(主機端) : 你目前使用的作業系統
  • Guest(客戶端) : 你於 VirtualBox 上安裝的作業系統
  • KVM : 即鍵盤、顯示器、滑鼠的英文首字母縮寫(Keyboard、Video、Mouse)