#user nobody; 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 { 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 on; # proxy_pass 和 fastcgi_pass中會用到 upstream定義的代理服務器 # upstream 中可以定義多個server 代理服務器 upstream vue{ server localhost:8081; } server { listen 8000; server_name localhost; #access_log logs/host.access.log main; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://vue; } #proxy_intercept_errors 針對location匹配后的結果是proxy_pass后的錯誤處理 proxy_intercept_errors on; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location = /404.html { root html; } location /term { proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; #完全可以自定義一個http header,在java中通過HttpServletRequest.getHeader(headerName) #就可以獲取到自定義頭的值 #語法是 proxy_set_header headerName headerValue; #如果headerValue不是nginx提供的變量,而是字符串,就通過單引號給引起來 proxy_set_header luo-hao-nan 'luohaonan'; proxy_pass http://localhost:8082/; } } } # c:\nginx-1.16.0>nginx -h # nginx version: nginx/1.16.0 # 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簡單配置思路 # 圍繞着location展開,對匹配的路徑進行 [被請求內容] 定位 # [被請求內容] 可以來自本地文件系統,由root指令指定[被請求內容]的存放位置 # [被請求內容] 也可以來自proxy_pass指令指定的地址,此時nginx將把請求轉發到proxy_pass指令指定的地址 # proxy_pass指令后面的指定的地址 可以直接是一個url比如[http://localhost:8082/] # proxy_pass指令后面的指定的地址 也可以是upstream定義的一組url的名稱入上面的vue,此時請求被分發到vue對應的一組url上面 # 通過proxy_pass后在后端服務接口會丟失部前端用戶的信息,比如說ip地址。為了解決這個問題,需要使用proxy_set_header指令, # 通過proxy_set_header指令設置頭信息,讓頭中包含自定義的信息,然后再后端服務接口中在手動取出對應的頭信息就ok了, # 比如所針對nginx代理后服務端接口使用java的情況下,HttpServletRequest.getRemoteAddr()獲取到的是nginx的地址,而不是真實的 # 客戶瀏覽器的地址,那么通過在location中設置proxy_set_header X-Real-IP $remote_addr;就可以在后端服務接口中通過header獲取 # 客戶的真實ip了。HttpServletRequest.getHeader("X-Real-IP").需要注意的是header名稱是任意的,也可以設置成其他的名稱, # 要靈活的操作就ok了。 # 如果使用proxy_pass,同樣想使用error_page功能,那么需要設置proxy_intercept_errors為on