1、Nginx是什麼
Nginx是HTTP服務器,可將服務器上的靜態文件通過HTTP協議展示給客戶端。
2、Nginx能做什麼有什麼優勢
客戶端假設通過HTTP協議訪問A網站中的應用服務器,那麼網站管理者可在服務器加一個Nginx(也就是所謂的反向代理),讓客戶端線先請求Nginx,隨後Nginx去請求應用服務器,然後將結果返回給客戶端。那麼可能會有小夥伴疑惑既然可以直接訪問HTTP,那爲何要多此一舉,去先訪問代理呢,這麼做就什麼好處呢,優勢如下。
優勢1-支持負載均衡
當一個網站訪問量特別大的時候,網站的各種速度都會越來越慢,一臺服務器肯定是不夠用了。這個時候就需要將應用部署在多臺服務器上,將請求平攤給多臺服務器來處理。這樣的好處是,萬一某一臺服務器GG了,但只要還有其他的服務器正常運行,就不會影響使用。這個時候就可以通過Nginx反向代理來實現負載均衡。
下面這個配置會將請求輪詢分配到服務器中,這樣當客戶端請求次數多的時候,可以由不同的服務器來處理。
- upstream myapp {
- server192.168.1.1:8080; # 服務器1
- server192.168.1.2:8080; # 服務器2
- server192.168.1.3:8080; # 服務器3
- }
- server {
- listen80;
- location / {
- proxy_pass http://myapp;
- }
- }
- 可以通過ip-hash的方式,根據客戶端ip地址的hash值來請求分配給固定的某一個服務器處理。
- upstream myapp {
- ip_hash;
- server192.168.1.1:8080;
- server192.168.1.2:8080;
- server192.168.3.2:8080;
- }
- server {
- listen80;
- location / {
- proxy_pass http://myapp;
- }
- }
- 服務器的硬件會影響他的性能,所以一般把大部分請求分配給好的服務器,把少量請求分配給差的服務器是比較好的一種做法,這個時候我們可以過weight關鍵字來來控制 weight越大,負載的權重就越大 還可用過max_fails 字段控制請求失敗次數:允許請求失敗的次數默認爲 當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤 然後通過設置關鍵字
fail_timeout:max_fails來設置
失敗後,暫停的時間 - tream myapp {
- server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=30s;
- server 192.168.2.1:8080 weight=3 max_fails=2 fail_timeout=30s;
- }
- server {
- listen80;
- location / {
- proxy_pass http://myapp;
- }
- }
優勢2-虛擬主機
負載均衡雖然很好用,但並不是適合所有的網站,例如有的網站,訪問量較小,所以需要節約成本,這個時候就需要將多個網站放在同一臺服務器上。例如將A和B兩個網站部署在同一臺服務器上,然後將兩個域名同時解析到一個IP地址,但是要讓用戶通過兩個域名打開兩個完全不同的網站,彼此之間不影響,就像訪問兩個服務器一樣,這個時候就像2個虛擬主機。
- server {
- listen80default_server;
- server_name _;
- return444; # 過濾其他域名的請求,返回444狀態碼
- }
- server {
- listen80;
- server_name a; # a網站域名
- location / {
- proxy_pass http://localhost:8082; # 對應端口號8082
- }
- }
- server {
- listen80;
- server_name b; # b網站域名
- location / {
- proxy_pass http://localhost:8083; # 對應端口號8083
- }
- }
這個時候在服務器8082和8083分別開了一個應用,客戶端可以通過不同的域名去訪問,根據server_name可以反向代理到對應的應用服務器。
虛擬主機的原理是通過HTTP請求頭中的Host是否匹配server_name來實現的,另外server_name配置還可以過濾將某些域名指向你主機服務器的惡意行爲。
優勢3-FastCGI
Nginx不支持PHP等語言,但是它可以通過FastCGI來將請求扔給某些語言或框架處理(例如PHP、Python、Perl)。
配置中將.php結尾的請求通過FashCGI交給PHP-FPM處理,PHP-FPM是PHP的一個FastCGI管理器。
- server {
- listen80;
- location ~ \.php$ {
- include fastcgi_params;
- fastcgi_param SCRIPT_FILENAME /PHP文件路徑$fastcgi_script_name; # PHP文件路徑
- fastcgi_pass127.0.0.1:9000; # PHP-FPM地址和端口號
- # 另一種方式:fastcgi_pass unix:/var/run/php5-fpm.sock;
- }
- }