??小白從零開(kāi)始用SSH在Linux服務(wù)器上構(gòu)建Wordpress網(wǎng)站

最近對(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)單:

  1. 在出錯(cuò)頁(yè)面上F12打開(kāi)Console控制臺(tái),發(fā)現(xiàn)紅色出錯(cuò)文件,把地址復(fù)制下來(lái).
    就是這個(gè):cloud-cdn-digitalocean-com.global.ssl.fastly.net
  2. 搜個(gè)"在線DNS檢測(cè)"的網(wǎng)站, 把剛才的地址復(fù)制進(jìn)去,
    開(kāi)始檢查DNS,得到一大堆響應(yīng)IP, 記住幾個(gè)個(gè)TTL值最小的.
  3. 然后找到本機(jī)的hosts文件, Windows在C:\Windows\System32\drivers\etc\這個(gè)地方,有個(gè)叫hosts的文件.
  4. 用文本編輯器打開(kāi)它, 在最下面按照185.31.18.249 cloud-cdn-digitalocean-com.global.ssl.fastly.net這種格式,
    把剛才找到的訪問(wèn)良好的IP地址填進(jìn)去,每個(gè)一行.
  5. 保存. 這時(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)境的安裝包.
還真的是一鍵安裝,好快, 但是! 但是:

  1. 所有所有所有文件都默認(rèn)安裝的/aliyundata/這個(gè)目錄,有點(diǎn)個(gè)性.還得重新去研究它的目錄結(jié)構(gòu).
  2. 運(yùn)行老出錯(cuò),出了錯(cuò),還不容易百度出問(wèn)題答案--因?yàn)橛玫娜颂倭?
  3. 最讓人煩的是--默認(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-availabesites-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里直接ViNano來(lái)編輯這些配置文件的,雖然改動(dòng)不多看起來(lái)不難.
但是我個(gè)性還是有點(diǎn)特別,在我正式學(xué)ViNano之前, 一點(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ò)成功的做法是:

  1. 把default挪到外面隨便什么地方.
  2. 然后在sites-available/中建一個(gè)隨便名字的文件,比如nginx-test.
  3. 然后再到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.logerrors.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ū)聊天.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吆倦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俘枫,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異账胧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)先紫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門治泥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人泡孩,你說(shuō)我怎么就攤上這事车摄。” “怎么了仑鸥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵吮播,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我眼俊,道長(zhǎng)意狠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任疮胖,我火速辦了婚禮环戈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘澎灸。我一直安慰自己院塞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布性昭。 她就那樣靜靜地躺著拦止,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糜颠。 梳的紋絲不亂的頭發(fā)上汹族,一...
    開(kāi)封第一講書(shū)人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音其兴,去河邊找鬼顶瞒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛元旬,可吹牛的內(nèi)容都是我干的榴徐。 我是一名探鬼主播守问,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼箕速!你這毒婦竟也來(lái)了酪碘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盐茎,失蹤者是張志新(化名)和其女友劉穎兴垦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體字柠,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡探越,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窑业。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦幔。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖常柄,靈堂內(nèi)的尸體忽然破棺而出鲤氢,到底是詐尸還是另有隱情,我是刑警寧澤西潘,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布卷玉,位于F島的核電站,受9級(jí)特大地震影響喷市,放射性物質(zhì)發(fā)生泄漏相种。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一品姓、第九天 我趴在偏房一處隱蔽的房頂上張望寝并。 院中可真熱鬧,春花似錦腹备、人聲如沸衬潦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)别渔。三九已至,卻和暖如春惧互,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喇伯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工喊儡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稻据。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓艾猜,卻偏偏與公主長(zhǎng)得像买喧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匆赃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理淤毛,服務(wù)發(fā)現(xiàn),斷路器算柳,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 第一章 Nginx簡(jiǎn)介 Nginx是什么 沒(méi)有聽(tīng)過(guò)Nginx低淡?那么一定聽(tīng)過(guò)它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,639評(píng)論 24 1,002
  • [TOC] 為什么要更改 toString 格式 在實(shí)際開(kāi)發(fā)中瞬项,經(jīng)常需要對(duì) entity 實(shí)例調(diào)試的時(shí)候重寫(xiě) to...
    木貓尾巴閱讀 2,149評(píng)論 1 2
  • 今天五一放假
    孟凡蓉閱讀 257評(píng)論 0 0
  • 一片輕柔潔白的羽毛隨著清風(fēng)盤旋飄揚(yáng)蔗蹋,越過(guò)綠樹(shù),飄落在獨(dú)自坐在候車長(zhǎng)椅的年輕人腳下年輕人俯身拾起羽毛囱淋,認(rèn)真的夾在書(shū)...
    十點(diǎn)半的地鐵z閱讀 516評(píng)論 3 1