docker部署nginx(雲服務器/虛擬機通用版)

1.docker中部署nginx

1.1 拉取鏡像

  • docker pull nginx

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”
    Alt

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不被重寫的失誤。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章