Nginx是什麼?
Nginx (engine x) 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。
Nginx使用C語言編寫的,相較於Apache\lighttpd具有佔有內存少,穩定性高等優勢,並且依靠併發能力強,豐富的模塊庫以及友好靈活的配置而聞名。
Nginx通常用來做什麼?
1.反向代理
反向代理舉例:用戶想訪問:”http://ooxx.me/readme“,但ooxx.me上並不存在readme頁面,他是偷偷從另外一臺服務器上取回來,然後作爲自己的內容吐給用戶,但用戶並不知情,這很正常,用戶一般都很笨。這裏所提到的ooxx.me 這個域名對應的服務器就設置了反向代理功能。
反向代理對於客戶端而言它就像是原始服務器,並且客戶端不需要進行任何特別的設置。
2.負載均衡
Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。
3.HTTP靜態服務器
不用過多解釋,主要提供HTTP/js/css/pictures等靜態文件的訪問。
4.正向代理
正向代理,也就是傳說中的代理,他的工作原理就像一個跳板,簡單的說,我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器,這個代理服務器呢,他能訪問那個我不能訪問的網站,於是我先連上代理服務器,告訴他我需要那個無法訪問網站的內容,代理服務器去取回來,然後返回給我。
正向代理是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。
tomcat 與 nginx,apache的區別是什麼?
相同:它們都是提供web服務的。
不同:apache/nginx功能相似,是靜態服務器,通常處理靜態資源html,圖片等,是web server。相比較而言,nginx引起優越的性能使其使用率慢慢超過了apache。
tomcat是Web Container,也就是Web容器,可以實現 前兩者的作用,但是不是很擅長。
通常可以使用apache+tomcat 或者 nginx+tomcat 配合使用。
nginx實踐
安裝:
中文文檔http://www.nginx.cn/doc/
官網安裝方式:http://nginx.org/en/download.html
也可以採用文檔安裝方式
nginx命令使用:
nginx -h 可以查看幫助
nginx version: nginx/1.12.1
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: NONE)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
常用就是:
$ ./nginx #啓動
$ nginx -s stop/quit/reopen/reload #分別對應快速停止/停止/重啓/熱啓動
配置文件詳解
nginx默認配置文件是nginx.conf,我們可以複製備份一個,然後做相應的操作。
配置文件結構如圖:
這是一份帶註釋的配置文件,可以方便地配置自己想要的功能:
#user nobody;
#開啓進程數 <=CPU數
worker_processes 1;
#錯誤日誌保存位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#進程號保存文件
#pid logs/nginx.pid;
events {
#每個進程最大連接數(最大連接=連接數x進程數)
worker_connections 1024;
}
http {
#文件擴展名與文件類型映射表
include mime.types;
#默認文件類型
default_type application/octet-stream;
#日誌文件輸出格式 這個位置相於全局設置
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#請求日誌保存位置
#access_log logs/access.log main;
#打開發送文件
sendfile on;
#tcp_nopush on;
#連接超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
#打開gzip壓縮
#gzip on;
#設定負載均衡的服務器列表
upstream myproject {
#weigth參數表示權值,權值越高被分配到的機率越大
#max_fails 當有#max_fails個請求失敗,就表示後端的服務器不可用,默認爲1,將其設置爲0可以關閉檢查
#fail_timeout 在以後的#fail_timeout時間內nginx不會再把請求發往已檢查出標記爲不可用的服務器
#這裏指定多個源服務器,ip:端口,80端口的話可寫可不寫
server 192.168.1.78:8080 weight=5 max_fails=2 fail_timeout=600s;
#server 192.168.1.222:8080 weight=3 max_fails=2 fail_timeout=600s;
}
#第一個虛擬主機
server {
#監聽IP端口
listen 80;
#主機名
server_name localhost;
#設置字符集
#charset koi8-r;
#本虛擬server的訪問日誌 相當於局部變量
#access_log logs/host.access.log main;
#對本server"/"啓用負載均衡
location / {
root html; #定義服務器的默認網站根目錄位置
index index.html index.htm; #定義首頁索引文件的名稱
#以下是一些反向代理的配置可刪除.
# proxy_pass http://myproject; #請求轉向myproject定義的服務器列表
# proxy_redirect off;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# client_max_body_size 10m; #允許客戶端請求的最大單文件字節數
# client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數,
# proxy_connect_timeout 90; #nginx跟後端服務器連接超時時間(代理連接超時)
# proxy_send_timeout 90; #後端服務器數據回傳時間(代理髮送超時)
# proxy_read_timeout 90; #連接成功後,後端服務器響應時間(代理接收超時)
# proxy_buffer_size 4k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
# proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設置
# proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)
# proxy_temp_file_write_size 64k; #設定緩存文件夾大小,大於這個值,將從upstream服務器傳
}
location /upload {
alias e:/upload;
}
#設定查看Nginx狀態的地址
location /NginxStatus {
stub_status on;
access_log off;
#allow 192.168.0.3;
#deny all;
#auth_basic "NginxStatus";
#auth_basic_user_file conf/htpasswd;
}
#404頁面
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
# 500之類的錯誤頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
# 對PHP的支持
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# 對PHP的支持
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# 可以配置多個server
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
# 對HTTPS的支持
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
配置:反向代理
反向代理應該是Nginx做的最多的一件事了,什麼是反向代理呢,以下是百度百科的說法:反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。簡單來說就是真實的服務器不能直接被外部網絡訪問,所以需要一臺代理服務器,而代理服務器能被外部網絡訪問的同時又跟真實服務器在同一個網絡環境,當然也可能是同一臺服務器,端口不同而已。 下面貼上一段簡單的實現反向代理的代碼
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host:$server_port;
}
}
保存配置文件後啓動Nginx,這樣當我們訪問localhost的時候,就相當於訪問localhost:8080了
配置:負載均衡
負載均衡也是Nginx常用的一個功能,負載均衡其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。簡單而言就是當有2臺或以上服務器時,根據規則隨機的將請求分發到指定的服務器上處理,負載均衡配置一般都需要同時配置反向代理,通過反向代理跳轉到負載均衡。而Nginx目前支持自帶3種負載均衡策略,還有2種常用的第三方策略。
1、RR(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。
簡單配置
upstream test {
server localhost:8080;
server localhost:8081;
}
server {
listen 81;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}
負載均衡的核心代碼爲
upstream test {
server localhost:8080;
server localhost:8081;
}
這裏我配置了2臺服務器,當然實際上是一臺,只是端口不一樣而已,而8081的服務器是不存在的,也就是說訪問不到,但是我們訪問http://localhost 的時候,也不會有問題,會默認跳轉到http://localhost:8080 具體是因爲Nginx會自動判斷服務器的狀態,如果服務器處於不能訪問(服務器掛了),就不會跳轉到這臺服務器,所以也避免了一臺服務器掛了影響使用的情況,由於Nginx默認是RR策略,所以我們不需要其他更多的設置。
2、權重
指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。 例如
upstream test {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}
那麼10次一般只會有1次會訪問到8081,而有9次會訪問到8080
3、ip_hash
上面的2種方式都有一個問題,那就是下一個請求來的時候請求可能分發到另外一個服務器,當我們的程序不是無狀態的時候(採用了session保存數據),這時候就有一個很大的很問題了,比如把登錄信息保存到了session中,那麼跳轉到另外一臺服務器的時候就需要重新登錄了,所以很多時候我們需要一個客戶只訪問一個服務器,那麼就需要用iphash了,iphash的每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
4、fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
5、url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。 在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
以上5種負載均衡各自適用不同情況下使用,所以可以根據實際情況選擇使用哪種策略模式,不過fair和url_hash需要安裝第三方模塊才能使用,由於本文主要介紹Nginx能做的事情,所以Nginx安裝第三方模塊不會再本文介紹
HTTP服務器
Nginx本身也是一個靜態資源的服務器,當只有靜態資源的時候,就可以使用Nginx來做服務器,同時現在也很流行動靜分離,就可以通過Nginx來實現,首先看看Nginx做靜態資源服務器
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
root e:wwwroot;
index index.html;
}
}
這樣如果訪問http://localhost 就會默認訪問到E盤wwwroot目錄下面的index.html,如果一個網站只是靜態頁面的話,那麼就可以通過這種方式來實現部署。
動靜分離
動靜分離是讓動態網站裏的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以後,我們就可以根據靜態資源的特點將其做緩存操作,這就是網站靜態化處理的核心思路
upstream test{
server localhost:8080;
server localhost:8081;
}
server {
listen 80;
server_name localhost;
location / {
root e:wwwroot;
index index.html;
}
# 所有靜態請求都由nginx處理,存放目錄爲html
location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
root e:wwwroot;
}
# 所有動態請求都轉發給tomcat處理
location ~ .(jsp|do)$ {
proxy_pass http://test;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root e:wwwroot;
}
}
這樣我們就可以吧HTML以及圖片和css以及js放到wwwroot目錄下,而tomcat只負責處理jsp和請求,例如當我們後綴爲gif的時候,Nginx默認會從wwwroot獲取到當前請求的動態圖文件返回,當然這裏的靜態文件跟Nginx是同一臺服務器,我們也可以在另外一臺服務器,然後通過反向代理和負載均衡配置過去就好了,只要搞清楚了最基本的流程,很多配置就很簡單了,另外localtion後面其實是一個正則表達式,所以非常靈活
正向代理
正向代理,意思是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理。當你需要把你的服務器作爲代理服務器的時候,可以用Nginx來實現正向代理。
resolver 114.114.114.114 8.8.8.8;
server {
resolver_timeout 5s;
listen 81;
access_log e:wwwrootproxy.access.log;
error_log e:wwwrootproxy.error.log;
location / {
proxy_pass http://$host$request_uri;
}
}
resolver是配置正向代理的DNS服務器,listen 是正向代理的端口,配置好了就可以在ie上面或者其他代理插件上面使用服務器ip+端口號進行代理了。