公司業務擴展須要大力提升微信用戶的關注度,可是主服務器都在境外,國內客戶訪問速度成爲了最大的障礙。前後試驗過CloudFlare跟騰訊DNS加速,可是都沒法逾越咱們的萬里長城萬里長。因此決定將服務區塊總體遷移,將國際跟國內業務分開。在對比了騰訊跟阿里兩朵雲彩以後,決定牽手小肥鵝。老闆問爲啥用肥鵝?「便宜!」 我撇下兩個字跟一個大大的驚歎號絕塵而去,留下老闆一人在風中感激不盡......php
服務器的配置須要根據的不一樣的需求作不一樣的改動,雲服務器的好處是比較靈活,能夠根據後續發展作適當調整。根據咱們公司的業務模式我選擇了以下的配置:html
對於系統,在CentOS跟Ubuntu之間我作了一個選擇:Ubuntu. 這裏作個簡單的說明,不少人說用CentOS好由於支持週期長,並且優化效果更好。可是從公司運營成本角度講,Ubuntu上的套件數量豐富,更新快,安裝簡單,部署速度快。基本上起一個服務器也就不到半個小時,多臺的話能夠本身作映射,而後修改dns路由器直接切換到新服務器上了。對於迭代頻繁的項目來講仍是很是適合的。mysql
有點跑偏了,言歸正傳,老司機開車了,你們一塊兒飛起來:nginx
任何一個雲都提供了SSH登錄模式,有的人喜歡給每一個SSH登錄配一個專屬的公鑰,我我的的習慣是用我自己Mac電腦的公鑰去匹配相關SSH登錄,這因人而異。其次,處於安全考慮騰訊雲給Ubuntu系統自動配置一個用戶ubuntu,這個用戶不是root用戶,這個要注意一下。 具體的Linux登錄實例網上有不少,我就不在這裏的嘚啵了,給個官網連接:
連接描述sql
如我前文提到的,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並不在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安裝成功後,接下來咱們須要走一些基本配置。首先是要找到你的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)。問你怕沒??open_basedir
選項可以控制PHP腳本只能訪問指定的目錄,這樣可以避免PHP腳本訪問不該該訪問的文件,必定程度上限制了phpshell的危害。disable_functions = system,passthru,exec,shell_exec,popen,phpinfo
expose_php = Off
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.
啥也不說了,開整:
$ 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?由於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 這連個目錄就是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服務。/etc/nginx/nginx.conf
文件,設置server_tokens off;
bind-address = 127.0.0.1
在文件/etc/mysql/my.cnf
裏面disable_functions
禁止不安全函數,控制最大文件上傳Size,而後記得修改max_execution_time
, max_input_time
, memory_limit
, 記得修改cgi.fix_pathinfo=0
總算嘚啵完了,你們辛苦了?
*本文的一些圖片來自網絡,若有任何侵權告之必刪