1.docker中部署nginx
1.1 拉取鏡像
1.2 創建掛載目錄
- mkdir -p /data/nginx/{conf,conf.d,html,logs}
1.3 在conf目錄下創建nginx.conf 文件
#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;
server {
listen 80;
server_name www.flaming.top;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#靜態模板
location /item {
# 先找本地
root html;
if (!-f $request_filename) { #請求的文件不存在,就反向代理
proxy_pass http://127.0.0.1:80;
break;
}
}
location / {
proxy_pass http://127.0.0.1:9006;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
server {
listen 80;
server_name notice.flaming.top;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://127.0.0.1:9006;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
server {
listen 80;
server_name api.flaming.top;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
location /api/upload {
rewrite "^/(.*)$" /zuul/$1;
}
location / {
proxy_pass http://127.0.0.1:9010;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
server {
listen 80;
server_name image.flaming.top;
# 監聽域名中帶有group的,交給FastDFS模塊處理
location ~/group([0-9])/ {
#ngx_fastdfs_module;
}
location / {
root /flaming/static;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
1.4 創建Nginx容器
- docker run --name mynginx -d -p 82:80 -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/logs:/var/log/nginx -d docker.io/nginxdocker run -di --name=myday_nginx -p 88:80 nginx
1.5 如果是在雲服務器中,配置上述之後, 訪問請求會報錯502
- 2020/04/26 03:23:17 [error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 39.177.34.48, server: notice.flaming.top, request: “GET /index.html HTTP/1.1”, upstream: “http://127.0.0.1:9006/index.html”, host: “notice.flaming.top”
nginx中proxy_set_header Host $host的作用
- nginx爲了實現反向代理的需求而增加了一個nginx_http_proxy_module模塊。其中proxy_set_header指令就是該模塊需要讀取的配置文件。所有設置的值含義和http請求頭中的含義完全相同,出了host外還有X-Forward_For。
- Host的含義表明請求的主機名,nginx作爲反向代理使用,而如果後端的服務器設置有類似反制裁措施或者根據http請求頭來進行路由或判斷功能的話,反向代理層的nginx不會重寫請求頭中的host字段,加你會導致請求失敗。注意:默認方向代理服務器會想後端服務器發送請求,且請求頭中的host字段應爲proxy_pass指令設置。
- 同理,X_Forward_For字段表示該條http請求是有誰發起的?如果反向代理服務器不重寫該請求頭的話,那麼後端真實服務器在處理時會認爲所有的請求都來在反向代理服務器,如果後端有防攻擊策略的話,那麼機器就被封掉了。因此,在配置用作反向代理的nginx中一般會增加兩條配置,修改http的請求頭:
proxy_set_header Host $http_host;
proxy_set_header X-Forward-For $remote_addr;
http_host和remote_addr都是nginx導出的變量,可以在配置文件中直接使用。若host請求頭沒有出現請求頭中,則http_host值爲空,但是host值一般爲主機域名。一般來說,都會用host代替http_host變量,從而避免http請求中丟失host頭部的情況下host不被重寫的失誤。