一塊兒飛系列之:騰訊雲配置Ubuntu16.04, Nginx, PHP 7, MySql, PhpMyAdmin, 域名

前言

公司業務擴展須要大力提升微信用戶的關注度,可是主服務器都在境外,國內客戶訪問速度成爲了最大的障礙。前後試驗過CloudFlare跟騰訊DNS加速,可是都沒法逾越咱們的萬里長城萬里長。因此決定將服務區塊總體遷移,將國際跟國內業務分開。在對比了騰訊跟阿里兩朵雲彩以後,決定牽手小肥鵝。老闆問爲啥用肥鵝?「便宜!」 我撇下兩個字跟一個大大的驚歎號絕塵而去,留下老闆一人在風中感激不盡......php

系統配置

服務器的配置須要根據的不一樣的需求作不一樣的改動,雲服務器的好處是比較靈活,能夠根據後續發展作適當調整。根據咱們公司的業務模式我選擇了以下的配置:html

  • 基礎配置:8核CPU 16G內存
  • 系統硬盤:200G SSD雲硬盤
  • 數據硬盤:100G SSD雲硬盤
  • 操做系統:Ubuntu 16.04

對於系統,在CentOS跟Ubuntu之間我作了一個選擇:Ubuntu. 這裏作個簡單的說明,不少人說用CentOS好由於支持週期長,並且優化效果更好。可是從公司運營成本角度講,Ubuntu上的套件數量豐富,更新快,安裝簡單,部署速度快。基本上起一個服務器也就不到半個小時,多臺的話能夠本身作映射,而後修改dns路由器直接切換到新服務器上了。對於迭代頻繁的項目來講仍是很是適合的。mysql

有點跑偏了,言歸正傳,老司機開車了,你們一塊兒飛起來:nginx

SSH配置

任何一個雲都提供了SSH登錄模式,有的人喜歡給每一個SSH登錄配一個專屬的公鑰,我我的的習慣是用我自己Mac電腦的公鑰去匹配相關SSH登錄,這因人而異。其次,處於安全考慮騰訊雲給Ubuntu系統自動配置一個用戶ubuntu,這個用戶不是root用戶,這個要注意一下。 具體的Linux登錄實例網上有不少,我就不在這裏的嘚啵了,給個官網連接:
連接描述sql

Nginx配置

安裝

如我前文提到的,Ubuntu已經套好了不少軟件,安裝Nginx也是簡單到很是,只要執行下列命令便可安裝:mongodb

$    sudo apt-get update    // 先升級apt管理包!先升級apt管理包!先升級apt管理包!
$    sudo apt-get install nginx // 再安裝Nginx

// 注意,從Ubuntu 16.04開始 Nginx已經實現自動配置,裝完便可運行.

防火牆

而後檢查一下Ubuntu自帶的防火牆管理工具UFW是否爲開啓狀態:shell

$    sudo ufw status

若是是第一次安裝,一般的輸出結果爲:數據庫

Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere

若是你在上面的輸出沒看到Nginx字樣,請執行下面命令:json

$    sudo ufw allow 'Nginx HTTP' // 容許接受Nginx的HTTP請求

而後你能夠檢測UFW的支持列表:ubuntu

$    sudo ufw app list // 可重複上面的命令吧Nginx的HTTPS協議也安裝好

關於UFW,能夠自行查閱相關文檔,使用很簡單,能夠經過它控制你的網站連接,屏蔽IP地址,數據庫連接,郵件端口...

最後,讓咱們檢查一下Nginx的安裝狀況吧:

$    systemctl status nginx

若是安裝順利,輸出結果會有Active: active (running) 字樣.

測試

如今咱們能夠看看服務器訪問是否順利,首先是獲得當前服務器IP地址:

$    ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

上面命令會返回幾行結果,其中包括你的服務器的外網IP地址,而後你能夠經過:http://外網IP地址來訪問你的服務器,若是一切順利,你就會看到久違的畫面:

圖片描述

知識點

?關於Ngixn經常使用的文件以及目錄:

  • /etc/nginx 這個是存放全部Nginx相關的配置文件的目錄。
  • /etc/nginx/nginx.conf 這個是Nginx的全局默認配置文件,不建議修改若是你不清楚的話。
  • /etc/nginx/sites-available/ 這個目錄能夠理解爲你全部網站的配置文件目錄,可是並非全部的網站都發布了。
  • /etc/nginx/sites-enabled/ 這個目錄是你全部發布的網站的配置文件目錄。是經過symbolic link鏈接起來了,全部網站都是已經發布的網站。
  • /var/log/nginx/access.log Nginx的access日誌
  • /var/log/nginx/error.log Nginx的錯誤日誌

其餘目錄及文件請參考:經常使用目錄手冊

?啓動和中止Nginx服務:

//方法一:
$    sudo /etc/init.d/nginx start    // 開啓
$    sudo /etc/init.d/nginx stop     // 中止
$    sudo /etc/init.d/nginx restart  // 重啓

//方法二:
$    sudo systemctl start nginx      // 開啓
$    sudo systemctl stop nginx       // 中止 
$    sudo systemctl restart nginx    // 重啓

數據庫配置

安裝

簡簡單單:

$    sudo apt-get install mysql-server mysql-client

而後會有個提示 Do you want to continue? [Y/n] 輸入 Y 便可。在快安裝完畢時,會跳出設置 root 密碼的界面。注意該root爲數據庫的用戶,而非服務器帳戶, 別搞混了。

而後測試數據庫登錄是否正常:

$    mysql -u root –p // 輸入上一步設置的密碼

而後測試數據庫端口監聽是否正常:

$    netstat -an | grep 3306

處於安全考慮,我我的不太推薦配置遠程訪問。因此有須要瞭解遠程設置的童鞋請自行解決,我不負責?

知識點

?關於遠程設置,千萬別忘記修改/etc/mysql/my.cnf文件,把bind-address = 127.0.0.1開啓 。

?若是在後續開發過程當中遇到了相似下面這個錯誤,

SELECT list is not in GROUP BY clause and contains nonaggregated column 錯誤

解決辦法:得修改/etc/mysql/mysql.cnf 文件,添加下面一行代碼

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

?啓動和中止MySql服務:

$    sudo /etc/init.d/mysql start
$    sudo /etc/init.d/mysql stop
$    sudo /etc/init.d/mysql restart

PHP7配置

安裝

由於PHP7並不在Ubuntu 16.04的預備庫中,因此須要借用第三方倉庫安裝:

// 因爲我裝的是7.1版本的PHP,因此僅以此爲例,各位看官自行參考
$    sudo apt-add-repository ppa:ondrej/php  
$    sudo apt-get install php7.1 php7.1-fpm

// 而後可執行下面命令決定安裝那些php組件
$    sudo apt-cache search php7.1

// 我選擇的組件是:
$    sudo apt-get install php7.1-cli php7.1-common php7.1-json php7.1-opcache php7.1-mysql php7.1-mbstring php7.1-mcrypt php7.1-zip php7.1-xml php7.1-gd php7.1-curl php7.1-soap php-mongodb php-uuid php-radius php-http php-memcached php-memcache php-mailparse php-sass php7.1-bcmath

配置php.ini

通過上面的幾個命令,PHP安裝成功後,接下來咱們須要走一些基本配置。首先是要找到你的php.ini文件,捂臉吶喊在哪裏是沒有用的,要用下面的命令來找:

// 查找php.ini文件。這裏要注意不少網上的文章只給出默認的路徑但不是真正的執行的路徑。
$    php --ini |grep Loaded

// 而後打開php.ini
$    vim /path_to_php_ini/php.ini
  • 找到 cgi.fix_pathinfo=0 而且取消註釋而且設置值爲0 這是一個很不安全的設置,由於它告訴PHP若是找不到請求的文件(好比:store.php),那麼就試圖執行最接近的文件(好比:stores.php)。問你怕沒??
  • 控制php腳本能訪問的目錄。使用open_basedir選項可以控制PHP腳本只能訪問指定的目錄,這樣可以避免PHP腳本訪問不該該訪問的文件,必定程度上限制了phpshell的危害。
  • 關閉危險函數。若是打開了安全模式,那麼函數禁止是能夠不須要的,可是咱們爲了安全仍是考慮進去。disable_functions = system,passthru,exec,shell_exec,popen,phpinfo
  • 關閉PHP版本信息。爲了防止黑客經過telnet獲取服務器中php版本的信息,能夠選擇關閉該信息斜路:expose_php = Off
  • 防止SQL注入。設置magic_quotes_gpc = On將自動把用戶提交對sql的查詢進行轉換,好比把 ' 轉爲 '等,這對防止sql注射有重大做用。
  • 錯誤信息控制。display_errors = Off將所有關閉錯誤信息顯示,若是必需要顯示建議控制錯誤顯示級別: error_reporting = E_WARNING & E_ERROR。 固然若是是開發環境另當別論。這裏要特別注意一下,在Ubuntu系統裏,若是須要顯示php錯誤,要修改pool.d文件:
$    sudo vim /etc/php/7.1/fpm/pool.d  
// 找到並修改catch_workers_output = yes 來顯示php錯誤

配置完後要記得重啓PHP.

PhpMyAdmin配置

安裝

啥也不說了,開整:

$    sudo apt install phpmyadmin

注意 這裏沒有Nginx的選項,所只須要點擊TAB按鍵,而後選擇OK,而後點擊回車鍵

圖片描述

下面這一步要選擇Yes:

圖片描述

下面這一步請輸入一個高強度密碼:

圖片描述

知識點

這裏提早說一下,在域名配置完成後,當你訪問你的phpMyAdmin(這裏登錄是用到了以前設置的root用戶跟密碼)的時候你會看到不少系統的數據庫,若是你不想顯示這些系統信息能夠經過修改數據庫配置文件隱藏相關數據庫。

phpMyAdmin的config文件在: /var/lib/phpmyadmi/config.inc.php 若是你沒有找到這個文件,那麼你能夠執行下面的命令:

$    sudo mv /usr/share/phpmyadmin/config.sample.inc.php /var/lib/phpmyadmin/config.inc.php

而後你能夠添加下面的code在該文件最後:

$cfg['Servers'][$i]['hide_db'] = '^(information_schema|performance_schema|mysql|phpmyadmin|sys)$';
// 你能夠根據本身的須要選擇隱藏不一樣的數據庫

圖片描述

而後還要記得填寫一個加密鹽,否則會報錯。

$cfg['blowfish_secret'] = '寫入你本身的加密字串' ; 
/* 例如:bc9{8IdRoGm5Sdf(qt!s */

騰訊雲域名配置

各類雲的域名解析界面作的都很是友好,很直接。在這裏我就簡單說幾個知識點方便你們快速理解跟配置域名。

知識點

?首先的首先,不管你的域名是否在其餘地方備案成功,騰訊雲都要求你在他們那裏在備案一次,否則網站訪問不了。

?首先,若是你的域名是在騰訊雲之外的商家買的,你要去到你的域名管理界面修改域名的DNS設置,指向騰訊雲。

f1g1ns1.dnspod.net
f1g1ns2.dnspod.net

這個文檔,騰訊雲的官網寫的比較詳細,可自行參考。點擊這裏產看手冊

?其次,假設你的域名是rocknroll.com,服務器外網IP爲119.29.1.1

若是你但願訪客能夠經過: www.rocknroll.com訪問你的網站,設置爲:
圖片描述

若是你但願訪客能夠經過: rocknroll.com訪問你的網站,設置爲:
圖片描述

若是你但願將某些地址指向CDN,好比說圖片地址,設置爲:
圖片描述

若是你但願全部的子域名(*.rocknroll.com)均可以訪問,設置爲:
圖片描述

都設置好後給騰訊雲一些時間,而後你就能夠ping你的網址,若是一切順利將會返回你的外網IP:

$    ping rocknroll.com

// 你的外網IP會返回

其餘關於的記錄CNAME、TXT、MX、AAAA、SRV等等能夠參考官網手冊

HTTPS配置

爲何須要HTTPS?由於26歲以上的程序猿、工程獅都以爲須要,你本身看着辦吧。

騰訊雲提供了免費的SSL證書,雖然級別不高,不過對普通人絕對夠了,這點要給肥鵝個贊。

首先,打開SSL證書管理,而後點擊購買證書:
圖片描述

而後選擇域名型免費版(DV):
圖片描述

而後就填寫信息:
圖片描述

騰訊雲基本上用不了20分鐘就會批准https申請,而且會發送一封郵件到上面指定的郵箱。 收到郵件後能夠去下載編輯好的SSL文件。下載後,能夠經過scp命令上傳到你的網站上,由於咱們的服務器是Nginx,因此你要記得選擇打開Nginx文件夾。

圖片描述

知識點

?上傳跟管理SSL證書:

$    scp /本地機目錄Nginx/1_domain_bundle.crt ssh ubuntu@119.29.1.1:/tmp
$    scp /本地機目錄Nginx/2_domain_.key ssh ubuntu@119.29.1.1:/tmp

//  ubuntu  是騰訊雲提供的用戶名
//  119.29.1.1 是你網站的外網ip
//  tmp文件夾是服務器文件夾能夠不用修改權限直接上傳

而後要創建文件夾來管理你的SSL證書,個人習慣是在/etc/ssl/下面建立立相應的域名管理對應的SSL證書:

$    sudo mkdir cd /etc/ssl/domain.com
$    sudo mv /tmp/1_domain_bundle.crt /etc/ssl/domain.com
$    sudo mv /tmp/2_domain_.key /etc/ssl/domain.com

完事具有 只欠東風破

前面安裝的各類組件都是爲了這個最後的組合:創建Nginx網站對應文件:Server Block。在Nginx配置裏面我介紹了2個特殊目錄:

  • /etc/nginx/sites-available/ 這個目錄能夠理解爲你全部網站的配置文件目錄,可是並非全部的網站都發布了。
  • /etc/nginx/sites-enabled/ 這個目錄是你全部發布的網站的配置文件目錄。是經過symbolic
    link鏈接起來了,全部網站都是已經發布的網站。

這連個目錄就是Ngixn網站的核心配置文件。他們的關係是:sites-available是本體;sites-enabled是分身。初級的設置是:在你的服務器上每一個網站擁有一個單一的配置文件而且存放到本體裏面。而後根據須要能夠開啓一個對應的分身去打,去浪,去碰撞。

// 主體目錄結構。我我的喜愛用域名作爲文件夾的名字,這個徹底取決於我的。
etc/nginx/sites-available/
                    - rocknroll.com
                    - me.rocknroll.com
                    - phpmyadmin.rocknroll.com

// 創建對應的分身:
$    sudo ln -s  /etc/nginx/sites-available/rocknroll.com  /etc/nginx/sites-enabled/    
$    sudo ln -s  /etc/nginx/sites-available/me.rocknroll.com  /etc/nginx/sites-enabled/  
$    sudo ln -s  /etc/nginx/sites-available/phpmyadmin.rocknroll.com  /etc/nginx/sites-enabled/    

// 分身目錄結構
etc/nginx/sites-enabled/
                    - rocknroll.com
                    - me.rocknroll.com
                    - phpmyadmin.rocknroll.com

網站骨架搭好了,如今咱們來介紹怎樣網站配置Server Block。舉個例子,若是經過phpmyadmin.rocknroll.com訪問咱們以前設置好的phpMyAdmin軟件,能夠經過穿件配置文件達到目的:

// 網上有不少不一樣的方法生成下列文件,我這裏列出來的是相對容易理解跟閱讀的初級設置方法,僅供參考

server {
        listen                    80;  # 監聽80端口                               
        root                      /usr/share/phpmyadmin;    # 網站的絕對路徑       
        index                     index.php index.html index.htm index.nginx-debian.html;  # Index的可執行文件
        server_name               phpmyadmin.rocknroll.com; # 你的域名。這裏能夠用變量代替域名$host
        rewrite                   (.*) https://phpmyadmin.rocknroll.com$1 permanent; # 跳轉到HTTPS協議。這裏能夠用變量代替域名$host
}

server {
    listen                        443;  # 監聽443端口
    server_name                   phpmyadmin.rocknroll.com; # 你的域名。
    
    # 如下爲SSL證書設置
    ssl                           on;
    ssl_certificate               /etc/ssl/phpmyadmin.rocknroll.com/1_phpmyadmin.rocknroll.com_bundle.crt; # 存放SSL證書的絕對路徑
    ssl_certificate_key           /etc/ssl/phpmyadmin.rocknroll.com/2_phpmyadmin.rocknroll.com.key; # 存放SSL證書的絕對路徑
    ssl_session_timeout           5m;
    ssl_protocols                 TLSv1 TLSv1.1 TLSv1.2; # 按照這個協議配置
    ssl_ciphers                   ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 按照這個套件配置
    ssl_prefer_server_ciphers     on;
    
    
    root                          /usr/share/phpmyadmin; # 網站的絕對路徑 
    access_log                    /var/log/nginx/phpmyadmin.rocknroll.com.access.log;  # 網站的訪問日誌
    error_log                     /var/log/nginx/phpmyadmin.rocknroll.com.error.log;   # 網站的錯誤日誌 

    #location決定客戶端發過來的請求URI如何處理
    
    location / { # 處理全部請求
        index                     index.php;       
        try_files                 $uri $uri/ /index.php$is_args$query_string;
    }

    location ~ \.php$ { # 處理以php結尾的文件的全部請求
        try_files                 $uri =404;
        fastcgi_pass              unix:/run/php/php7.1-fpm.sock;
        fastcgi_index             index.php;
        fastcgi_param             SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include                   /etc/nginx/fastcgi_params;
    }
}

關於配置文件,咱們須要注意的幾個關鍵點:

檢測配置文件是否正確:

# 每次修改配置文件都要檢查一下,若是有錯誤會報錯。
$    sudo nginx -t   

# 而後根據須要重啓相關服務。
$    sudo /etc/init.d/nginx restart     //重啓Nginx
$    sudo /etc/init.d/php7.1-fpm restart    //重啓PHP

網站的絕對路徑,Nginx一般的配置喜歡是將網站放置到/var/www/html這個目錄下面,固然也能夠根據我的喜歡放到其餘路徑下面。比如我我的比較偏向放到 /srv/www下面.

root                      /usr/share/phpmyadmin;    
# 網站的絕對路徑, 若有須要能夠建立

網站域名:

server_name               phpmyadmin.rocknroll.com;
# 這裏是指定你的域名,能夠是一個能夠是多個, 用空格連接。這樣若是有用戶訪問該域名就會自動檢測這裏配對其餘設置。

強制HTTPS訪問

rewrite                   (.*) https://phpmyadmin.rocknroll.com$1 permanent;
# 這個是Nginx用於跳轉的一種方法, 相似htaccess的rewrite,主要是目的是強制改爲https訪問增長安全性

大功告成

到此爲止,LEMP(Linux, Nginx, MySQL, PHP)服務器的基礎設置完成!

最後簡單說一下基礎的服務器安全問題。

  • 要時常更新服務器軟件 $ sudo apt-get update && apt-get -s upgrade 這樣能夠杜絕不少最新的服務器腳本漏洞
  • 能不用遠程就不用遠程。若是實在要用請增強密碼設置。堅定不是用root遠程。而且改掉22端口: 修改/etc/ssh/sshd_config 取消 #Port 22的註釋改爲其餘號碼。必定要記得重啓sshd服務。
  • 隱藏Nginx的版本號碼。大牛能夠根據這個查找對應版本漏洞攻擊你的網站。 修改 /etc/nginx/nginx.conf文件,設置server_tokens off;
  • 強制使用HTTPS協議。
  • 數據庫也不要開啓遠程,要強制設置bind-address = 127.0.0.1在文件/etc/mysql/my.cnf裏面
  • PHP的安全要記得設置disable_functions禁止不安全函數,控制最大文件上傳Size,而後記得修改max_execution_time, max_input_time, memory_limit, 記得修改cgi.fix_pathinfo=0

總算嘚啵完了,你們辛苦了?

*本文的一些圖片來自網絡,若有任何侵權告之必刪

提早打個廣告:下一期我來講說怎麼在開發環境(staging) 跟生產環境(production)下發佈網站

相關文章
相關標籤/搜索