安裝
源碼方式
- nginx官網找到最新穩定版本【http://nginx.org/en/download.html】
- 安裝
cd /usr/local/soft wget http://nginx.org/download/nginx-1.18.0.tar.gz
- 解壓
tar -xzvf nginx-1.18.0.tar.gz
- 安裝依賴環境
# gcc環境:基本運作環境 # pcre:用于nginx的http子產品解析正規表達式 # zlib:使用者進行gzip壓縮 # openssl:用于nginx https協定的傳輸 yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
- 編譯安裝
cd /usr/local/soft/nginx-1.18.0 ./configure --prefix=/usr/local/soft/nginx make && sudo make install cd /usr/local/soft/nginx/
- 檢測安裝是否成功
/usr/local/soft/nginx/sbin/nginx -t -c /usr/local/soft/nginx/conf/nginx.conf
- 啟動nginx
# 預設配置檔案啟動 /usr/local/soft/nginx/sbin/nginx # 指定配置檔案啟動 ./nginx -c /usr/local/soft/nginx/conf/nginx-domains.conf ./nginx -c /usr/local/soft/nginx/conf/nginx-sdy.conf
- 浏覽器直接通路IP(HTTP協定預設80端口,不需要輸入):
http://159.75.79.151/
- copy vimfile
# 為了讓VIM檢視nginx配置檔案時文法高亮,需要把相應檔案copy到VIM目錄。 # 先确定本機的vimfiles目錄在哪個位置。 find / -name vimfiles cd /usr/local/soft/nginx-1.18.0 cp -r contrib/vim/* /usr/share/vim/vimfiles/
- 常用指令,在sbin目錄下,l例如【./nginx -v】
nginx -s reopen #重新開機Nginx nginx -s reload #重新加載Nginx配置檔案,然後以優雅的方式重新開機Nginx nginx -s stop #強制停止Nginx服務 nginx -s quit #優雅地停止Nginx服務(即處理完所有請求後再停止服務) nginx -t #檢測配置檔案是否有文法錯誤,然後退出 nginx -?,-h #打開幫助資訊 nginx -v #顯示版本資訊并退出 nginx -V #顯示版本和配置選項資訊,然後退出 nginx -t #檢測配置檔案是否有文法錯誤,然後退出 nginx -T #檢測配置檔案是否有文法錯誤,轉儲并退出 nginx -q #在檢測配置檔案期間屏蔽非錯誤資訊 nginx -p prefix #設定字首路徑(預設是:/usr/share/nginx/) nginx -c filename #設定配置檔案(預設是:/etc/nginx/nginx.conf) nginx -g directives #設定配置檔案外的全局指令 killall nginx #殺死所有nginx程序
- …
docker
建立挂載目錄
mkdir -p /usr/local/soft/nginx/{conf,conf.d,html,log}
啟動
docker run --name nginx01 -d -p 80:80 -v /usr/local/soft/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/soft/nginx/log:/var/log/nginx -v /usr/local/soft/nginx/html:/usr/share/nginx/html nginx
HTTP協定
HTTP 協定是基于應用層的協定,并且在傳輸層使用的 TCP 的可靠性通信協定
IP:端口
ip确定具體的位址,端口确定位址内的程序,組合在一起确定了某個程序的确定位置
域名
ip不易記住,用域名來友善人腦記憶,通過dns域名解析器來轉換
http預設端口是80,https預設端口443
協定://子域名.頂級域名.域名類型/資源路徑?參數
http://nginx.org
https://www.baidu.com:443
https://www.qq.com
https://user.qzone.qq.com/1165069099/infocenter?via=toolbar
- 協定:http、https
- 子域名:www、user.qzone
- 頂級域名:baidu、qq
- 域名類型:com、org、cn
- 資源路徑:/1165069099/infocenter
- 參數:?via=toolbar
特點
- 簡單快速
- 靈活
- 無連接配接
- 無狀态
MIME Type
描述消息内容類型的網際網路标準,常見的幾種類型
- 文本檔案:text/html,text/plain,text/css,application/xhtml+xml,application/xml,application/json
- 圖檔檔案:image/jpeg,image/gif,image/png
- 視訊檔案:video/mpeg,video/quicktime
檔案的渲染類型
- Accept:表示用戶端希望接受的資料類型,即告訴伺服器我需要什麼媒體類型的資料,此時伺服器應該根據 Accept 請求頭生産指定媒體類型的資料。
- Content-Type:表示發送端發送的實體資料類型,比如代碼中設定:resposne.setContentType(“application/json;charset=utf-8”),表示服務端傳回的資料格式是json。
請求封包格式
- 請求行【請求方法 uri 版本】空格分開,例如:POST /v1/sd HTTP/1.1
- 請求報頭
- 空行
- 正文主體,POST請求才有
請求方法 Request Method
- GET(查詢操作):擷取資源,不會改變資源資訊,不支援大資料的傳輸,參數明文顯示,敏感資訊請求不要使用。
- POST(建立操作):一般使用者用戶端傳輸一個實體給到服務端,讓服務端去儲存,資訊在請求體中,加密處理。
- PUT(更新操作):從用戶端向伺服器傳送的資料取代指定的文檔的内容。
- DELETE(删除操作):用戶端發起一個 Delete 請求要求服務端把某個資料删除。
- HEAD:獲得封包首部。
- OPTIONS:詢問支援的方法,允許用戶端檢視伺服器的性能。
- TRACE:追蹤路徑,回顯伺服器收到的請求,主要用于測試或診斷。
- CONNECT:HTTP/1.1 協定中預留給能夠将連接配接改為管道方式的代理伺服器。
響應封包格式
- 狀态行【HTTP/1.1 200 OK】
- 響應報頭
- 空行
- 響應正文
響應狀态碼
狀态碼:描述服務端向用戶端傳回的請求處理結果狀态,浏覽器可以知道伺服器是正常處理請求還是出現了錯誤。
- 1XX(Informational,資訊狀态碼):接收的請求正在處理。
- 2XX(Success,成功狀态碼):請求正常處理完畢。
- 3XX(Redirection,重定向狀态碼):需要進行附加操作以完成請求。
- 4XX(Client Error,用戶端請求錯誤碼):伺服器無法處理請求。
- 5XX(Sever Error,服務端錯誤代碼):伺服器處理請求出錯。
常見狀态碼
- 200:一切正常
- 301:永久重定向
- 404:請求資源不存在
- 500:服務端内部錯誤
通用頭字段 Common Header
字段 | 含義 |
---|---|
Cache-Control | 控制緩存的行為 |
Connection | 控制不再轉發給代理的首部字段、管理持久連接配接 |
Date | 建立封包的日期時間 |
Pragma | 封包指令 |
Trailer | 封包末端的首部一覽 |
Transfer-Encoding | 指定封包主體的傳輸編碼方式 |
Upgrade | 更新為其他協定 |
Via | 代理伺服器的相關資訊 |
Warning | 錯誤通知 |
請求頭字段
字段 | 含義 |
---|---|
Accept | 使用者代理可處理的媒, 本類型 |
Accept-Charset | 優先的字元集 |
Accept-Encoding | 優先的内容編碼 |
Accept-Language | 優先的語言(自然語言) |
Authorization | Web認證資訊 |
Expect | 期待伺服器的特定行為 |
From | 使用者的電子郵箱位址 |
Host | 請求資源所在伺服器 |
If-Match | 比較實體标記(ETag) |
If-Modified-Since | 比較資源的更新時間 |
If-None-Match | 比較實體标記(與If-Match相反) |
If-Range | 資源未更新時發送實體Byte的範圍請求 |
If-Unmodified-Since | 比較資源的更新時間(與If-Modified-Since相反) |
Max-Forwards | 最大傳輸逐跳數 |
Proxy-Authorization | 代理伺服器要求用戶端的認證資訊 |
Range | 實體的位元組範圍請求 |
Referer | |
TE | 傳輸編碼的優先級 |
User-Agent | HTTP用戶端程式的資訊 |
響應頭字段
字段 | 含義 |
---|---|
Accept-Ranges | 是否接受位元組範圍請求 |
Age | 推算資源建立經過時間 |
ETag | 資源的比對資訊 |
Location | 令用戶端重定向至指定URI |
Proxy-Authenticate | 代理伺服器對用戶端的認證資訊 |
Retry-After | 對再次發起請求的時機要求 |
Server | HTTP伺服器的安裝資訊 |
Vary | 代理伺服器緩存的管理資訊 |
WWW-Authenticate | 伺服器對用戶端的認證資訊 |
案例實戰
虛拟主機/綁定目錄
nginx.conf
反向代理
- 在内網中開啟兩個服務
# 服務字首 test curl http://172.16.0.8:8080/ # 服務字首 tiger curl http://172.16.0.8:8081/
- 修改配置檔案nginx.conf,部署在【159.75.79.151】中
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ #user nobody; worker_processes auto; error_log /usr/local/soft/nginx/logs/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { 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 /usr/local/soft/nginx/logs/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /usr/local/soft/nginx/conf/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /usr/local/soft/nginx/conf/conf.d/*.conf; # 負載均衡 upstream load_balancing_test { server 159.75.79.151:8080; server 49.234.55.50:8080; server 49.234.55.50:8081; } server { # 對外開放的端口,預設是80 listen 80; # 公網ip或域名 server_name 159.75.79.151; root /usr/share/nginx/html; # Load configuration files for the default server block. include /usr/local/soft/nginx/conf/default.d/*.conf; #location / { #} # 負載均衡測試,通路【http://159.75.79.151/load_balancing_test/tiger/test】 location /load_balancing_test { proxy_http_version 1.1; proxy_pass http://load_balancing_test/; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 1000M; } # 服務1映射資訊,通路【http://159.75.79.151/test/tiger/test】 location /test { proxy_http_version 1.1; proxy_pass http://172.16.0.8:8080/; # 轉換請求方法,預設是get proxy_method POST; # nginx 服務端 ip:port proxy_set_header Host $host:$server_port; #擷取 用戶端位址設定到 header 中 proxy_set_header X-Real-IP $remote_addr; # 擷取所有轉發請求的ip位址設定到 header 中 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 1000M; } # 服務2映射資訊,通路【http://159.75.79.151/tiger/test】 location /tiger { proxy_http_version 1.1; proxy_pass http://172.16.0.8:8081/; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 1000M; } # error_page 404 /404.html; # location = /404.html { # } #error_page 500 502 503 504 /50x.html; #location = /50x.html { #} } # Settings for a TLS enabled server. # # server { # listen 443 ssl http2 default_server; # listen [::]:443 ssl http2 default_server; # server_name _; # root /usr/share/nginx/html; # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 10m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # location / { # } # # error_page 404 /404.html; # location = /404.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } }
- …
負載均衡
負載政策
- 權重輪詢:wrr 【weight round-robin】
-
ip_hash:
nginx會根據用戶端ip的hash結果選擇一個真實伺服器,而且每次都會固定通路這台伺服器,可以解決session儲存問題。
- least_conn:目前活躍連接配接數越小,權重越大,優先選擇。
- 第三方負載政策,另查找資料
- …
配置塊
- weight
- max_fails
- fail_timeout
- down
- backup
- …
nginx.conf
重點關注 upstream 塊裡邊的内容 upstream server_group { }
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
#user nginx;
worker_processes auto;
error_log /usr/local/soft/nginx/logs/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /usr/local/soft/nginx/logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /usr/local/soft/nginx/conf/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /usr/local/soft/nginx/conf/conf.d/*.conf;
# 定義一個伺服器組
upstream server_group {
# 預設的輪詢算法
wrr;
server 49.234.55.50:8080 weight=2 max_fails=3 fail_timeout=15;
server 49.234.55.50:8081 down;
server 49.234.55.50:8082 backup;
}
server {
listen 80;
server_name 159.75.79.151;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /usr/local/soft/nginx/conf/default.d/*.conf;
location /load_balancing_test {
proxy_http_version 1.1;
proxy_pass http://server_group/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 1000M;
}
}
}
java -jar xxx.jar --server.port=9090