作為一個前端開發人員,懂點服務器端的知識也是必不可少的,畢竟,我們可不想為了做一個簡單的測試還得去麻煩別人,自給自足,沒什麼不好。如果你有時間和精力,向全棧邁進也未嘗不可。
我最近正在做一個仿iOS端微信的聊天App-WChat,從前端到後臺,全都是靠自己來實現。所以最近也接觸了一些服務器知識,後面還準備了一篇關於Node.js
的文章。該項目的WebSocket
是通過Node.js
來實現的,後期的數據請求可能也是基於Node.js
實現。
Nginx介紹
Nginx(engine x
)是一個高性能的HTTP服務器(其實不止HTTP服務器),一般主要用作負載均衡和反向代理(如果你不清楚什麼是反向代理,可以閱讀我的另一篇文章)。
Nginx有一個主進程和很多工作進程,主進程的作用只有一個:通過讀取配置文件(nginx.conf
)來維持工作進程正常工作。工作進程對應的才是實際的請求(request
),Nginx會自動將客戶端的請求高效的分發給工作進程。工作進程的數量在配置文件中定義,或者通過CPU的核心數自動調整。(可參考官方文檔)
在Linux系統下,Nginx的配置文件默認在/usr/local/nginx/conf/nginx.conf
、/etc/nginx/nginx.conf
或/usr/local/etc/nginx/nginx.conf
中。我是在CentOS
系統下使用的Nginx,本篇就基於CentOS
來介紹。
Nginx安裝
對於Nginx的安裝,官方的文檔在這裡,建議參閱官方說明(比較考驗英文)。我是一路上踏過很多坑才把Nginx安裝好(主要是由於Nginx版本和Linux版本都在不斷更新,而百度出來的大多數教程都是過時的,或多或少都會有些問題)。
yum安裝
推薦使用yum
來安裝,簡單省事。官方鏈接
方法很簡單,首先創建/etc/yum.repos.d/nginx.repo
文件,然後寫入以下內容:
[nginx] name=nginx repo baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/ gpgcheck=0 enabled=1
其中的OS
是你的Linux版本,我的是centos
,直接替換就好。OSRELEASE
是版本號,6.x就寫6
,7.x就寫7
。比如我的baseurl
就是http://nginx.org/packages/centos/6/$basearch/
。
然後就可以直接使用yum install -y nginx
命令來一建安裝,搞定。
通過yum安裝的Nginx的配置文件可能位於/etc/nginx/nginx.conf
。
源碼安裝
不推薦使用這種方法,對於新手來說太折騰了。首先要安裝依賴包:gcc
、g++
、PCRE
、zlib
、openSSL
。
安裝依賴
- 安裝
gcc
、g++
,用來編譯源碼;
$ yum install -y gcc gcc-c++
PCRE
,Perl正則表達式;
$ yum install pcre pcre-devel
zlib
,gzip壓縮;
$ yum install zlib zlib-devel
OpenSSL
,SSL協議。
$ yum install openssl openssl-devel
如果你愛折騰,這些依賴包也可以下載源碼,通過編譯來安裝。這裡最頭疼的就是版本之間的差異,涉及到的依賴包太多,有時候版本之間就會不兼容,或者需要其他的一些配置。
安裝Nginx
去官網下載Nginx,最好不要下載最新版本,如果最新版本跟網上大多數教程說的有差異的話,真的很折騰人。
Linux下命令行操作:
# 下載源碼 $ wget http://nginx.org/download/nginx-1.13.0.tar.gz # 解壓源碼 $ tar xvf nginx-1.13.0.tar.gz # 進入源碼目錄 $ cd nginx-1.13.0 # 配置、編譯、安裝 $ ./configure $ make $ make install
如果順利的話,Nginx就已經安裝完成啦。如果不順利的話,就自行百度去或直接採用上面介紹的yum
來安裝。./configure
命令可以帶很多參數進行配置,我記不住那麼多,需要的話還是自行百度。
這就是安裝Nginx大概的流程,先安裝依賴,再安裝Nginx。不同系統不同版本之間可能會有差異,按照上面的方法你也不一定會成功。起初我在./configure
這一步就總是失敗,就算帶上詳細的參數(--sbin-path
之類的)也是失敗。
Nginx基本使用
如果你已經成功安裝Nginx,那麼你現在直接在命令行中敲入nginx
,然後回車,即可啟動Nginx服務器。這時,你就可以在客戶端輸入你服務器的IP地址,就可以訪問服務器默認的頁面了。
啟動、停止、重新加載配置信息
啟動Nginx之後,你就可以使用下面的命令格式進行簡單的操作了。
$ nginx -s signal
其中,signal
可以是以下指令:
stop
:關閉Nginx,會立刻終止所有的客戶端請求。quit
:關閉Nginx,直接翻譯過來就是優雅的關閉。它會等當前所有的請求完成之後再關閉Nginx。reload
:重新加載配置文件。一般當你修改配置文件後,使用它可以讓修改的配置生效。reopen
:重新打開日誌文件,目前還沒用到它。
官方還介紹了通過kill
指令來向Nginx進程發送這些操作信號。
配置文件簡單說明
打開配置文件vim /usr/local/nginx/conf/nginx.conf
,文件結構大致如下:
http { server { listen 80; server_name www.mohng.com; location / { root html; index index.html index.htm; } location /wchat { root html; index index.html; } } server { listen 8080; serer_name mail.mohng.com; location / { index index.html; } } }
其中,一個server
就相當於一個服務器,你可以配置多個server
模塊來虛擬多個服務器。listen
表示該服務器監聽哪個端口,默認是80
端口。server_name
表示匹配主機名,比如我的server_name
是www.mohng.com
,那麼,當客戶端通過域名www.mohng.com
(前提是該域名已經正確解析到該服務器的IP地址)來訪問的時候,就是匹配到這個服務器。如果客戶端通過域名mail.mohng.com:8080
來訪問的時候,就會匹配到下面那個服務器。如果你通過IP直接訪問,會默認訪問第一個服務器。
location
就是匹配的路由,root
是返回給客戶端資源文件的根目錄,它是相對nginx
路徑的,也可以指定絕對路徑(比如:/usr/local/nginx/www
)。index
就是默認返回的文件名(比如index.html
,index.php
,index.asp
等)。
配置簡單的反向代理服務器,只需在匹配到的路由location
模塊中,使用proxy_pass
來轉到真實的服務器。
location / { proxy_pass http://www.baidu.com; }
更多配置文件的詳細說明請參閱官方文檔。
總結
其實,Nginx本身不難,難的是操蛋的英文。現在大多數工具、框架、技術文檔,都是大篇大篇的英文,看起來實在痛苦。就比如React
和Vue
,我相信在國內,學好Vue
比學好React
要容易的多吧。
不管什麼東西,最好的學習途徑還是官方文檔,畢竟,官方的文檔永遠都是最新的。就拿webpack
來說,現在網絡上大部分教程都還是基於1.x
的,如果直接拿來在2.x
中使用全是坑。