最近對(duì)網(wǎng)絡(luò)開(kāi)發(fā)的性質(zhì)大發(fā),由最簡(jiǎn)單的東西開(kāi)始一步一步入門,不知不覺(jué)一個(gè)月間就學(xué)到了我難以想象多的知識(shí). 雖然Wordpress會(huì)被一些高端開(kāi)發(fā)者鄙視, 尤其是它是基于PHP的(其實(shí)我也不適應(yīng),因?yàn)槲沂侵饕獙W(xué)習(xí)Python研發(fā)的), 但是作為一個(gè)領(lǐng)你入門的師父,Wordpress毫無(wú)疑問(wèn)是把你你領(lǐng)從零基礎(chǔ)領(lǐng)到高端的好師父! 下文就是我這幾天以Wordpress為契機(jī),研究在各種網(wǎng)絡(luò)服務(wù)器的成果. 內(nèi)置一些常見(jiàn)的坑及跳坑的方法.
先給自己配個(gè)服務(wù)器(VPS)吧
其實(shí)前些天免費(fèi)在AWS的EC2上面構(gòu)建服務(wù)器,感覺(jué)還是很爽很好玩的.
可是昨天,一想到1年以后就要說(shuō)白白了,就心有余悸.
因?yàn)檎绞召M(fèi)貌似很貴不打算續(xù)費(fèi),所以又看了看國(guó)內(nèi)一些既穩(wěn)定又靠譜的VPS商,阿里云之類.
感覺(jué)他們都還是貴,一年要上千.
各種搜索后,終于決定試一試國(guó)內(nèi)國(guó)外都大名鼎鼎的DigitalOcean.
插曲:DigitalOcean官網(wǎng)被"半墻"
DigitalOcean官網(wǎng)首頁(yè)能打開(kāi),說(shuō)明沒(méi)有被墻.
但是正式注冊(cè)的頁(yè)面,以及登錄后的頁(yè)面,都完全沒(méi)有樣式好難看啊!
必應(yīng)了下,發(fā)現(xiàn)原來(lái)Gov沒(méi)有屏這個(gè)網(wǎng)站,而是屏了它的css站 -_-!
解決方法好簡(jiǎn)單:
- 在出錯(cuò)頁(yè)面上F12打開(kāi)Console控制臺(tái),發(fā)現(xiàn)紅色出錯(cuò)文件,把地址復(fù)制下來(lái).
就是這個(gè):cloud-cdn-digitalocean-com.global.ssl.fastly.net
- 搜個(gè)"在線DNS檢測(cè)"的網(wǎng)站, 把剛才的地址復(fù)制進(jìn)去,
開(kāi)始檢查DNS,得到一大堆響應(yīng)IP, 記住幾個(gè)個(gè)TTL值最小的. - 然后找到本機(jī)的hosts文件, Windows在
C:\Windows\System32\drivers\etc\
這個(gè)地方,有個(gè)叫hosts
的文件. - 用文本編輯器打開(kāi)它, 在最下面按照
185.31.18.249 cloud-cdn-digitalocean-com.global.ssl.fastly.net
這種格式,
把剛才找到的訪問(wèn)良好的IP地址填進(jìn)去,每個(gè)一行. - 保存. 這時(shí)在打開(kāi)DigitalOcean的后臺(tái)頁(yè)面,就已經(jīng)正常了:)
購(gòu)買DigitalOcean服務(wù)器
然后是購(gòu)買環(huán)節(jié)啦,因?yàn)樵谝曨l里看到才5美元一個(gè)月,還不是國(guó)內(nèi)那種廉價(jià)空間,
算一個(gè)VPS, 還能通過(guò)SSH把它當(dāng)自己電腦一樣任意操控, 性價(jià)比太高了! 于是我毫不猶豫的打開(kāi)選購(gòu)頁(yè)面.
以前以為國(guó)外服務(wù)器都好高端,我又沒(méi)有國(guó)外銀行卡有沒(méi)有paypal怎么辦? 實(shí)際上一點(diǎn)問(wèn)題都沒(méi)有!
我試了下,把國(guó)內(nèi)的500塊錢工行駕照配的牡丹信用卡注冊(cè)上,成功!
不過(guò)當(dāng)時(shí)竟然沒(méi)有扣費(fèi)環(huán)節(jié),比較納悶. 必應(yīng)了下發(fā)現(xiàn), 他們是每個(gè)月1號(hào)扣費(fèi)的.
接下來(lái)就是創(chuàng)建服務(wù)器實(shí)例了.
花了不到幾十秒鐘就創(chuàng)建了一個(gè)叫"Droplet"小水滴的服務(wù)器(在AWS和阿里云中叫做實(shí)例),選擇安裝了Ubuntu 15.
第一步當(dāng)然是創(chuàng)建一個(gè)Image鏡像,省得玩壞了沒(méi)法初始化.
順便還給配了一個(gè)"Floating IP",所謂的浮動(dòng)靜態(tài)IP.
其實(shí)就是相當(dāng)于AWS的"Elastic IP",原理一樣:
給你一個(gè)固定的IP, 你可以不用服務(wù)器本身的公網(wǎng)IP, 而把它綁定上去.
如果你注銷這個(gè)服務(wù)器, 你的IP還是不會(huì)變,可以再綁定到另一個(gè)服務(wù)器上.
這樣一來(lái)你也不用再到自己的域名解析處改一遍對(duì)應(yīng)IP了.
用SSH連接服務(wù)器
因?yàn)橹霸贏WS上混了幾天, 又在阿里云上給客戶部署網(wǎng)站, 用SSH控制遠(yuǎn)程主機(jī)已經(jīng)很熟練了.
所以DigitalOcean這里也沒(méi)費(fèi)功夫.
過(guò)程很簡(jiǎn)單,如果是Linux/Mac電腦,直接在終端用SSH
命令就可以了.
如果像我一樣用Windows, 那就下載個(gè)綠色/單文件軟件--大名鼎鼎的Putty.exe
.用它就就ok.
打開(kāi)軟件后,在HostName處輸入服務(wù)器給的公網(wǎng)IP, 選擇SSH連接,然后點(diǎn)擊Open, 連接上了哈哈!
輸入用戶名密碼就可以開(kāi)始隨意操作了,像linux本機(jī)一樣.
這里略過(guò)了很多細(xì)節(jié),是因?yàn)椴幌胫貜?fù)網(wǎng)上各種教程.
在Linux上安裝Wordpress環(huán)境
我真是個(gè)小白,但是是個(gè)愛(ài)學(xué)習(xí)愛(ài)嘗試的小白. 所以借著各種不同的機(jī)會(huì)嘗試了不同的環(huán)境搭建方法.
第一種嘗試 - XAMPP
我是真的小白,因?yàn)橹霸陔娔X本機(jī)裝wordpress,圖個(gè)簡(jiǎn)單,用的是一鍵安裝XAMPP,很方便.
第二種嘗試 - AWS上的LAMP
然后在AWS上面,用的是LAMP, 不算一鍵安裝但是也照著各種教程復(fù)制粘貼出來(lái)了環(huán)境.
第三種嘗試 - 阿里云一鍵安裝環(huán)境
再然后到阿里云上,試了試阿里云推薦的阿里云linux一鍵安裝web環(huán)境
的安裝包.
還真的是一鍵安裝,好快, 但是! 但是:
- 所有所有所有文件都默認(rèn)安裝的
/aliyundata/
這個(gè)目錄,有點(diǎn)個(gè)性.還得重新去研究它的目錄結(jié)構(gòu). - 運(yùn)行老出錯(cuò),出了錯(cuò),還不容易百度出問(wèn)題答案--因?yàn)橛玫娜颂倭?
- 最讓人煩的是--默認(rèn)安裝phpwind,一個(gè)比較丑的論壇搭建平臺(tái).
而且這個(gè)phpwind是作為網(wǎng)站根目錄的,連phpmyadmin都部署在其下.卸載是個(gè)非常困難的事.
因?yàn)檫@個(gè)一鍵安裝,好多東西全都亂了.不得已要重啟服務(wù)器.
因?yàn)橹貑⑿枰绦膨?yàn)證,我給客戶打了個(gè)電話, 告訴我驗(yàn)證碼-_-
重啟后,重裝系統(tǒng),恢復(fù)初始設(shè)置. 吸取教訓(xùn),做了個(gè)鏡像備份.
第四種嘗試 - Lamp
然后又學(xué)者用另一個(gè)一鍵安裝LAMP環(huán)境的著名方法:tasksel
語(yǔ)法極其簡(jiǎn)單:直接輸入tasksel
回車,就出現(xiàn)一個(gè)相對(duì)好看的有顏色的頁(yè)面.
選擇lamp, 按回車,就開(kāi)始一鍵安裝了.
過(guò)程中出現(xiàn)幾個(gè)輸密碼的環(huán)節(jié).然后等十來(lái)分鐘,就全好了.
可是問(wèn)題仍然存在: 老是報(bào)mysql的錯(cuò)誤.
所以針對(duì)mysql搜索了好幾個(gè)地方,瀏覽了數(shù)十篇文章. 終于找到靠譜方案了:
找到/etc/mysql/文件夾,發(fā)現(xiàn)里面沒(méi)有my.cnf這個(gè)必要文件,
還好有一個(gè)叫my.cnf.bak的備份,復(fù)制出一份.再次運(yùn)行安裝mysql-server就正常了.
然后apt-get install phpmyadmin
,過(guò)程中選apache2, 輸入密碼后,等一會(huì)就完成了.
第五種嘗試 - Nginx
回到當(dāng)前的DigitalOcean服務(wù)器上, 我厭倦了之前那些嘗試, 再試試新方法看看會(huì)不會(huì)方便點(diǎn):
最后按照youtube非常多的教學(xué)視頻指示,一句命令安裝好了所有依賴軟件:
root@username:~# sudo apt-get install php5-fpm nginx mysql-server php5-mysql
雖然不知道這幾個(gè)依賴包的順序有什么講究(看起來(lái)好像有一點(diǎn)點(diǎn)邏輯性?).
但是一句話之后,除了mysql彈出界面輸入密碼外,其他不用管就全部搞定了.
這時(shí)候service nginx start
,就啟動(dòng)了nginx服務(wù)器.
打開(kāi)自己的網(wǎng)址, 赫然地顯示著Welcome to nginx!
好方便!!
話說(shuō)回來(lái), 這林林總總的各種一鍵安裝, 最后證明最靠譜的還是手動(dòng)地指明地按照那些依賴包.
它們雖然看似是一鍵裝好, 可是真正裝好了,后面費(fèi)勁的事還多著呢. 缺點(diǎn)都可以堆積成山了.
Wordpress安裝 Install Wordpress
這里實(shí)際上非常簡(jiǎn)單,因?yàn)樾乱淮鷑ginx的網(wǎng)站根目錄是默認(rèn)設(shè)置在和apache一樣的地方/var/www/html
,所以很好找.
- 切換到網(wǎng)站根目錄,輸入
wget http://wordpress.org/latest.zip
.
下載好了wp的安裝包,unzip
解壓(提示沒(méi)有unzip程序,則apt-get install unzip
).
然后為了方便,可以到ftp中修改解壓后的wordpress名字為自己想要的.
或者把所有文件拷貝到根目錄,作為主站,都可以. - 然后就是重要的權(quán)限問(wèn)題了:
wordpress因?yàn)榘鞣N上傳文件,下載文件,安裝插件,重寫(xiě)url等功能,所以需要一些必要的磁盤讀寫(xiě)權(quán)限.
這里最方便的就是給wordpress整個(gè)目錄賦權(quán):chmod 777 -R /var/www/html/wpblog
, 777代表最高權(quán)限.
-R代表連文件夾帶文件夾里所有的子文件子文件夾都執(zhí)行.
知道有的人喜歡用chown
,雖然我不懂區(qū)別,但也沒(méi)發(fā)現(xiàn)有什么問(wèn)題.
如果不是打開(kāi)網(wǎng)址開(kāi)始配置wordpress時(shí),出現(xiàn)了"寫(xiě)入權(quán)限不夠"類似錯(cuò)誤的話, 我也不可能會(huì)學(xué)到Linux 777權(quán)限這東西.
實(shí)際上,如果為了安全著想,沒(méi)必要給整個(gè)wordpress目錄授予最高權(quán)限.
只要給wp-content文件夾授權(quán)即可.但是初次安裝,wp需要讀寫(xiě)wp-config.php文件,否則只能自己在服務(wù)器上手動(dòng)創(chuàng)建它.
這個(gè)權(quán)限給誰(shuí)我還沒(méi)想明白.
所以如果不那么重要,直接整個(gè)目錄賦予權(quán)限,就沒(méi)半點(diǎn)問(wèn)題啦.
更高級(jí)的以后再考慮. - 下一步,就是需要在MySQL中為wordpress創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)了.這一步也非常簡(jiǎn)單,沒(méi)遇到過(guò)錯(cuò)誤.
mysql -u root -p
登進(jìn)mysql,然后輸入密碼,進(jìn)入后create database 數(shù)據(jù)庫(kù)名;
,就OK了.
剩下所有的wordpress配置就不用手動(dòng)修改wp-config.php
文件了.
那些都可以等到網(wǎng)站可以訪問(wèn)php后(配置Nginx),在網(wǎng)頁(yè)界面上進(jìn)行配置了. - 到了這一步是什么情景呢?
比如我的wordpress文件夾叫wpblog, 放在/var/www/html下.
所以當(dāng)在網(wǎng)址中輸入http://abc.com/wpblog/
后,會(huì)出現(xiàn)403 Forbidden
字樣.
那就證明,Nginx正在健康監(jiān)聽(tīng), 只是配置文件沒(méi)有配置好罷了!
Nginx的配置文件 Nginx Configuaration
Linux小白的我,在之前弄亂了幾個(gè)服務(wù)器后終于小心翼翼的知道,改任何配置文件都需要備份一個(gè)原始出來(lái).
沒(méi)成想,這竟然成了我配置Nginx第一步的大錯(cuò)誤!
剛一開(kāi)始配置Nginx就出錯(cuò)了 Error occured before setting up the nginx config file
具體說(shuō)來(lái)是這樣的:
教學(xué)中說(shuō),先要找到nginx的配置文件,也就是/etc/nginx/sites-available/
下的default
文件.
我理所當(dāng)然地在改之前復(fù)制出了一個(gè)default-backup
文件.
然后為了方便,離開(kāi)終端,直接FTP中用我喜歡的編輯器打開(kāi)了default
文件,遵照nginx語(yǔ)法改了幾行.
然后重啟nginx服務(wù)器.借著噩夢(mèng)就開(kāi)始了, 各種報(bào)錯(cuò):
root@username:~# sudo service nginx restart
Job for nginx.service failed because the control process exited with error code. See "systemctl stat us nginx.service" and "journalctl -xe" for details.
然后不管是start還是restart都是這句話.納悶了.就按照出錯(cuò)指示,輸入了systemctl status nginx.service
:
root@username:~# systemctl status nginx.service
nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2016-02-23 08:27:51 EST; 22s ago
Process: 8508 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx. pid (code=exited, status=0/SUCCESS)
Process: 8609 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, st atus=1/FAILURE)
Main PID: 7194 (code=exited, status=0/SUCCESS)
完全看不懂...當(dāng)然后來(lái)也證明,這個(gè)對(duì)我排除錯(cuò)誤完全沒(méi)作用.于是又照著指示輸入了第二個(gè)命令:
root@username:~# journalctl -xe
-- Subject: Session 12 has been terminated
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
--
-- A session with the ID 12 has been terminated.
Feb 23 08:33:44 username sshd[8792]: Connection closed by 180.151.30.102 [preauth]
Feb 23 08:33:45 username sshd[8770]: pam_unix(sshd:session): session closed for user root
Feb 23 08:33:45 username systemd-logind[551]: Removed session 13.
-- Subject: Session 13 has been terminated
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
--
-- A session with the ID 13 has been terminated.
Feb 23 08:34:06 username sshd[8795]: Connection closed by 180.151.30.102 [preauth]
Feb 23 08:34:54 username sshd[8797]: Connection closed by 106.187.100.177 [preauth]
Feb 23 08:35:16 username sshd[8799]: Connection closed by 180.151.30.102 [preauth]
Feb 23 08:35:35 username sshd[8801]: Connection closed by 180.151.30.102 [preauth]
Feb 23 08:36:33 username sudo[8806]: root : TTY=pts/1 ; PWD=/etc/nginx/sites-available ; USER=
Feb 23 08:36:33 username sudo[8806]: pam_unix(sudo:session): session opened for user root by root(
Feb 23 08:36:33 username sudo[8806]: pam_unix(sudo:session): session closed for user root
Feb 23 08:36:48 username sudo[8829]: root : TTY=pts/1 ; PWD=/etc/nginx/sites-available ; USER=
Feb 23 08:36:48 username sudo[8829]: pam_unix(sudo:session): session opened for user root by root(
Feb 23 08:36:48 username sudo[8829]: pam_unix(sudo:session): session closed for user root
Feb 23 08:36:50 username sshd[8852]: Connection closed by 180.151.30.102 [preauth]
Feb 23 08:37:25 username sshd[8854]: Connection closed by 180.151.30.102 [preauth]
Feb 23 08:37:57 username sshd[8856]: Connection closed by 101.200.80.28 [preauth]
Feb 23 08:38:03 username sshd[8858]: Connection closed by 180.151.30.102 [preauth]
完全不懂.事實(shí)證明這段話也對(duì)我沒(méi)什么用. 然后我就開(kāi)始了谷歌之旅(國(guó)內(nèi)這個(gè)問(wèn)題的回答極少).
最簡(jiǎn)短的回答就是,如果同時(shí)安裝了apache服務(wù)器,那么把a(bǔ)pache2或者h(yuǎn)ttpd服務(wù)關(guān)掉就ok了.
但是我沒(méi)裝apache啊,所以問(wèn)題不算解決.
還有其他谷歌到的回答,也都很少有直接解決的.試了一些命令,也都沒(méi)用.
這時(shí)開(kāi)始急躁了.
然后就試著卸載nginx,發(fā)現(xiàn)為什么卸載了后nginx的配置文件夾還在呢?
也許要加purge參數(shù)?可是我不會(huì)用,而且怕刪錯(cuò)其他東西.所以先不管.
再安裝一遍nginx,問(wèn)題仍然沒(méi)變.
我又換個(gè)方法,到Stackoverflow上面去搜.
換著關(guān)鍵詞關(guān)鍵句搜了好幾種,才搜出來(lái)一種答案比較多的.
看了十來(lái)篇答案吧,有一個(gè)回答中說(shuō)了依據(jù)輸入nginx -t
查看什么,忘了.
我看命令很簡(jiǎn)單,也不像會(huì)破壞環(huán)境什么的,就試著輸了一下,返回以下結(jié)果:
root@username:~# nginx -t
nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/default-backup: 17
nginx: configuration file /etc/nginx/nginx.conf test failed
就兩句話,然后都了一下,眼睛瞪大--恍然大悟!
原來(lái)問(wèn)題出在這里: 我為了備份,而創(chuàng)建了一個(gè)叫default-backup
的文件,
沒(méi)想到這小子與default
文件沖突: nginx會(huì)讀取sites-availabe
或sites-enabled
文件夾中的每一份文件,如果一個(gè)文件夾下有兩個(gè)這文件,nginx就會(huì)全部讀取.
那文件中第17行是對(duì)80端口的監(jiān)聽(tīng),聲明兩遍,當(dāng)然會(huì)顯示一個(gè)a duplicate default server for 0.0.0.0:80
了!
所以....我迅速的....沒(méi)直接刪掉備份文件,而是先下載到了本地桌面,再刪掉.
此時(shí)再輸入nginx -t
,大功告成!返回:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
簡(jiǎn)單兩句,看著真給力.
這下大概能猜到了,nginx -t
大概是測(cè)試nginx配置文件語(yǔ)法的, 也就是debug用的.
如果哪里配置語(yǔ)法或邏輯寫(xiě)錯(cuò)了,這里會(huì)顯示出來(lái).
service nginx start
,緊接著打開(kāi)瀏覽器自己的網(wǎng)址, Welcome to nginx!
看著激動(dòng)人心啊哈哈!
也許這就是程序世界的樂(lè)趣吧. 這個(gè)世界匯集的都是一些喜歡玩解謎游戲的小孩子.
Real configuration for Nginx
教程里都是Linux老油條們?cè)赟SH里直接Vi
或Nano
來(lái)編輯這些配置文件的,雖然改動(dòng)不多看起來(lái)不難.
但是我個(gè)性還是有點(diǎn)特別,在我正式學(xué)Vi
或Nano
之前, 一點(diǎn)都不想碰.
所以還是用簡(jiǎn)單好理解的方法不給自己添堵, 直接在Filezilla這個(gè)多數(shù)人都在用的FTP,
右鍵點(diǎn)擊/etc/nginx/sites-available/default
這個(gè)文件,點(diǎn)擊view,
用我默認(rèn)的sublime編輯器打開(kāi),設(shè)好nginx語(yǔ)法高亮.
簡(jiǎn)單瀏覽了下. 除去注釋后,基本就這么幾句話,結(jié)構(gòu)很簡(jiǎn)單:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
之前看過(guò)兩三集的nginx教程, 有那么一點(diǎn)點(diǎn)印象而已.
反正好像是一個(gè)server{...},代表一個(gè)站點(diǎn).
你并排多寫(xiě)幾個(gè)server{...}塊,就能同時(shí)擁有好幾個(gè)站點(diǎn),比如一個(gè)基于php的wordpress站點(diǎn),一個(gè)基于python的django站點(diǎn).
我猜的哈. 反正對(duì)現(xiàn)在階段來(lái)說(shuō) ,這是真的無(wú)所謂的.
我的經(jīng)驗(yàn)是,
新手學(xué)東西不能怕錯(cuò),但是不能少了猜.
如果有人看到這里,也請(qǐng)不要嫌我業(yè)余.
我反倒覺(jué)得這代表著一種非常實(shí)際的心理歷程,更容易幫助和我一樣的新人體會(huì)這個(gè)過(guò)程.
繼續(xù)猜上面的語(yǔ)法.
-
listen 80 default_server;
好像是說(shuō)默認(rèn)服務(wù)器會(huì)監(jiān)聽(tīng)80端口.
但listen [::]:80 default_server;
就不知道了,看下一句. -
root /var/www/html;
這個(gè)好理解,那就是網(wǎng)站(也叫站點(diǎn), 應(yīng)用, app等)的根目錄位置.
看到一些老視頻,好像過(guò)去nginx的默認(rèn)根目錄在/usr/share/html
這里.
新nginx改到這里更好,和apache一樣,省得去記別的了. -
server_name _;
這個(gè),估計(jì)是站點(diǎn)名字或者網(wǎng)址吧? -
location / {...}
這可能定義根目錄的一些url地址問(wèn)題? -
try_files $url $url/ =404
,這個(gè)還真有點(diǎn)不好猜,只知道估計(jì)是和404文件未找到有關(guān).
然后就可以開(kāi)始正式學(xué)習(xí)nginx語(yǔ)法了.
老樣子,到y(tǒng)outube上面找各種好看好玩好懂的教學(xué)視頻.
插一句關(guān)于youtube上學(xué)習(xí)這事, 自從考過(guò)雅思后, 詞匯量和聽(tīng)力都上了一個(gè)高度, youtube觀看英語(yǔ)視頻幾乎沒(méi)有障礙.
且實(shí)際上,IT技術(shù)方面的視頻, 即使它是德語(yǔ)法語(yǔ)的,也能看懂.
但是不懂英語(yǔ)的話, 連搜什么關(guān)鍵詞都不知道-_-!
通過(guò)這個(gè)事我才透徹地意識(shí)到,學(xué)好外語(yǔ), 翻過(guò)那堵墻, 真真正正的像進(jìn)入了一個(gè)新世界, 一切都很新鮮很方便.
切實(shí)體會(huì)到了我們與他們之間的差距在哪.
看了幾個(gè)視頻后,有點(diǎn)體會(huì)就是:
怎么好像每個(gè)人的配置都不太一樣?不是指的目錄地址和站點(diǎn)名稱不一樣, 怎么好像邏輯都不一樣?
見(jiàn)招拆招, 于是我回到了默認(rèn)的/etc/nginx/sites-available/default
文件,用帶語(yǔ)法高亮的sublime編輯器讀了一下.發(fā)現(xiàn)最上頭的說(shuō)明好像說(shuō)得很地道很實(shí)在:
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# 你應(yīng)該看看下面這些地址來(lái)加強(qiáng)理解Nginx的配置文件, 并最終能夠釋放Nginx的真正實(shí)力
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Generally, you will want to move this file somewhere, and start with a clean
# file but keep this around for reference. Or just disable in sites-enabled.
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
然后我看到了QuickStart快速入門的字樣, 就打開(kāi)了這個(gè)網(wǎng)址,翻了下看到竟然有wordpress,
喜出望外--因?yàn)橐呀?jīng)掌握了wordpress, 用已知的東西來(lái)理解nginx是最好不過(guò)了.
然后翻到wordpress處,發(fā)現(xiàn)官網(wǎng)早已經(jīng)給好了"配方". 且每句都有注釋來(lái)解釋,非常友好.
# Upstream 用來(lái)抽象化php的后端連接
upstream php {
server unix:/tmp/php-cgi.socket;
server 127.0.0.1:9000;
}
server {
## 把你的網(wǎng)址放在這里,如baidu.com
server_name baidu.com;
## 只此一處的站點(diǎn)根目錄地址的聲明
root /var/www/wordpress;
## 這句應(yīng)該寫(xiě)在http區(qū)塊(類似http {...}這樣的)里,
## 如果你寫(xiě)了http區(qū)塊,就沒(méi)必要放在這.
index index.php;
## (設(shè)置網(wǎng)站favicon.ico圖標(biāo)的訪問(wèn)邏輯,)
location = /favicon.ico {
# (如果沒(méi)找到這個(gè)文件,則不適用規(guī)則)
log_not_found off;
access_log off;
}
## (設(shè)置robots.txt的訪問(wèn)邏輯)
## (允許所有對(duì)它的訪問(wèn)(因?yàn)槊總€(gè)訪問(wèn)者都應(yīng)該遵守嘛))
location = /robots.txt {
allow all;
# (如果沒(méi)找到這個(gè)文件,則不適用規(guī)則)
log_not_found off;
access_log off;
}
## (根目錄的訪問(wèn)邏輯. 注:"/"代表根目錄)
location / {
# 這句話巨酷, 因?yàn)闆](méi)有php會(huì)被當(dāng)成靜態(tài)文件訪問(wèn)
# 加入"?$args"這部分后, 非默認(rèn)的固定鏈接在使用url查詢字串時(shí)就不會(huì)中斷
try_files $uri $uri/ /index.php?$args;
}
## (目錄中所有.php文件的訪問(wèn)邏輯)
location ~ \.php$ {
#注意: 你應(yīng)該在php.ini中寫(xiě)了"cgi.fix_pathinfo = 0;" 這句話.
# (引入fastcgi.conf這個(gè)文件)
include fastcgi.conf;
# (fastcgi相關(guān)的報(bào)錯(cuò):開(kāi))
fastcgi_intercept_errors on;
fastcgi_pass php;
}
## (目錄中所有的js|css|png|jpg|jpeg|gif|ico文件訪問(wèn)邏輯)
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
## 最大過(guò)期期限
expires max;
## 如果沒(méi)有找到這個(gè)文件 則不適用規(guī)則
log_not_found off;
}
}
上面的中文是我自己翻譯的, 帶括號(hào)的注釋中是我根據(jù)字面意思猜測(cè)的.
簡(jiǎn)單的翻譯官網(wǎng)注釋后,好像有點(diǎn)了解怎么回事了. 頁(yè)面中往下翻,還有一段可選的代碼配置:
location /wordpress {
try_files $uri $uri/ /wordpress/index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(/wordpress)(/.*)$;
}
上面說(shuō)是,如果你想把wordpress作為一個(gè)子目錄(而不是網(wǎng)站的根目錄)使用,那你應(yīng)該在上面總配置中相應(yīng)位置加上這幾句代碼.
根據(jù)字面意思理解, 應(yīng)該是加入了一個(gè)/wordpress
子目錄的訪問(wèn)邏輯, 并為所有php文件的訪問(wèn)邏輯中加入了/wordpress
子目錄專門的地址解析規(guī)則.
往下翻, 有一段Rewrite相關(guān)配置. 玩過(guò)Wordpress的都知道Rewrite重寫(xiě)規(guī)則的重要性.
在Apache服務(wù)器中, 如果.htaccess
文件和apache的rewrite模塊文件沒(méi)有寫(xiě)對(duì)的話,wordpress就無(wú)法使用固定鏈接
或稱偽鏈接
這種好玩意了.
官網(wǎng)對(duì)于重寫(xiě)的完整配置(包括剛才的主配置)如下:
map $uri $blogname{
~^(?P<blogpath>/[^/]+/)files/(.*) $blogpath ;
}
map $blogname $blogid{
default -999;
#Ref: http://wordpress.org/extend/plugins/nginx-helper/
#include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;
}
server {
server_name example.com ;
root /var/www/example.com/htdocs;
index index.php;
location ~ ^(/[^/]+/)?files/(.+) {
try_files /wp-content/blogs.dir/$blogid/files/$2 /wp-includes/ms-files.php?file=$2 ;
access_log off; log_not_found off; expires max;
}
#avoid php readfile()
location ^~ /blogs.dir {
internal;
alias /var/www/example.com/htdocs/wp-content/blogs.dir ;
access_log off; log_not_found off; expires max;
}
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
rewrite ^(/[^/]+)?(/wp-.*) $2 last;
rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}
location / {
try_files $uri $uri/ /index.php?$args ;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass php;
}
#add some rules for static content expiry-headers here
}
這里官網(wǎng)的注釋解釋不多,而且很難字面上理解了, 所以先跳過(guò).
到這里, 就不是我能簡(jiǎn)單猜出來(lái)的了.
而且看起來(lái)也不像是復(fù)制粘貼能行的?
所以還是帶著問(wèn)題回到y(tǒng)outube, 看看別人都是怎么配置的.
現(xiàn)在,感覺(jué)自己離"真相"已經(jīng)不太遠(yuǎn)了.
其實(shí)youtube上專門為了wordpress配置nginx的視頻并不多,這點(diǎn)令我好奇.
之前國(guó)內(nèi)翻閱文章時(shí)看到恩多次在ngingx上配置wordpress的文章,可是國(guó)外并不流行?
總之,看了幾個(gè)靠譜的視頻后發(fā)現(xiàn),他們的配置到我這里都用不了.
于是修改關(guān)鍵詞搜索, 搜php與nginx, 學(xué)到了幾個(gè)最簡(jiǎn)單方法的配置.
當(dāng)然還是不管用,不過(guò)當(dāng)我再回頭看官網(wǎng)的這段專為wordpress的配置, 就明白了需要修改哪里了.
簡(jiǎn)單修改后,終于成功! 默認(rèn)的最簡(jiǎn)單最靠譜的配置如下(這里面你哪句話都不用改就可以用):
# Upstream to abstract backend connection(s) for php
upstream up_php {
server unix:/var/run/php5-fpm.sock;
server 127.0.0.1:9000;
}
server {
server_name _;
root /var/www/html;
index index.php;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass up_php;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
然后重啟nginx.噠噠噠!經(jīng)典的wordpress配置頁(yè)面出現(xiàn)啦!剩余步驟30秒內(nèi)全部完成!哈哈,太高興了.
現(xiàn)在再回頭寫(xiě)寫(xiě)從這部分學(xué)到的經(jīng)驗(yàn),感覺(jué)真的很寶貴:
Nginx配置時(shí)的一些經(jīng)驗(yàn) Experiences for Nginx configuaration
配置文件的目錄 Config file position: sites-enabled & sites-availabe
在配置文件夾中,/etc/nginx/sites-enabled/
文件夾非常重要.
它里面只有1個(gè)鏈接文件,鏈接指向同級(jí)目錄sites-available/
中的default
文件.
主要配置都是在這里寫(xiě),同樣的這個(gè)目錄中只能有1個(gè)文件.
即1個(gè)主軸文件,可以寫(xiě)其他任意個(gè)被主軸引用的分支文件.
就像官網(wǎng)提醒的,如果不想隨便改default應(yīng)當(dāng)把它挪走,然后自己另寫(xiě)一個(gè).
我試過(guò)成功的做法是:
- 把default挪到外面隨便什么地方.
- 然后在
sites-available/
中建一個(gè)隨便名字的文件,比如nginx-test
. - 然后再到
sites-available/
中創(chuàng)建一個(gè)它的快捷方式:
ln -s /etc/nginx/sites-available/nginx-test nginx-test
.
這樣一來(lái)nginx就會(huì)先讀取'sites-enabled/',然后跳轉(zhuǎn)到sites-available/
的對(duì)應(yīng)配置了.
調(diào)試配置文件 Debug Configs
- 之前說(shuō)到的
nginx -t
,還真的是極其好用的調(diào)試命令.
用法是:每次修改完配置文件,然后輸入nginx -t
,就會(huì)告訴你,語(yǔ)法對(duì)不對(duì),文件引用邏輯對(duì)不對(duì), cgi對(duì)不對(duì)等等.如果不對(duì)的話會(huì)告訴你再哪行出錯(cuò). 多方便~
最后如果這一步通過(guò)了,那么就可以重啟nginx正確運(yùn)行了. - 如果上一個(gè)命令不夠,那么還有一個(gè)方法:
就是到/var/log/nginx/
中,查看accesses.log
和errors.log
.
這兩個(gè)文件一個(gè)告訴你每次都有誰(shuí)訪問(wèn)了網(wǎng)站,另一個(gè)告訴你服務(wù)器都出現(xiàn)了哪些異常狀態(tài).
兩個(gè)文件都寫(xiě)得很簡(jiǎn)單,很容易從字面上理解.
尤其是errors.log,一眼就能看出來(lái)是哪個(gè)地方配置出錯(cuò)了.
Nginx對(duì)PHP的配置 Nginx Config for PHP
為了Wordpress正確運(yùn)行, 那肯定是要配置PHP了.
當(dāng)然如果只要普通的php文件,那不用寫(xiě)上邊那么多.
站點(diǎn)必須要處理多媒體文件之類,所以才多寫(xiě)了那些句子.
真正為了解析php的,是其中的:
upstream up_php {
server unix:/var/run/php5-fpm.sock;
server 127.0.0.1:9000;
}
和
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass up_php;
}
從youtube視頻上學(xué)到的是,php解析的確要用到upstream上流這個(gè)模塊了.
其中需要指定解析的方式是unix的php5-fpm.sock這個(gè)東西.
而location對(duì)于所有php文件的解析模塊中, fastcgi_pass up_php
是指,將所有php文件都傳到剛才定義的upstream模塊中(即php5-fpm.sock文件)進(jìn)行處理.
剩下的include fastcgi.conf,就是引用外部一個(gè)文件了.
這個(gè)文件中只有一些簡(jiǎn)單的默認(rèn)配置,無(wú)需我們修改也能正常運(yùn)行網(wǎng)站.
根據(jù)視頻教學(xué)中,很多人還會(huì)修改php5-fpm
的配置,那就又是另一種語(yǔ)法了,對(duì)新手一點(diǎn)都不友好.
而且像nginx配置一樣也會(huì)常寫(xiě)錯(cuò),要debug調(diào)試.
順帶一提的是,調(diào)試方法幾乎一樣:先php5-fpm -t
,不行的話就再打開(kāi)/var/log/php5-fpm.log
查看錯(cuò)誤信息.
修改通過(guò)后,用service php5-fpm restart
重啟就OK了.
不過(guò)我的測(cè)試中,偷懶不修改它,就這樣保持默認(rèn)也能正常運(yùn)行Wordpress :)
好啦,到此為止,從零開(kāi)始的整個(gè)LNMP+Wordpress筆記就已經(jīng)完成了.歡迎來(lái)評(píng)論區(qū)聊天.