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不被重写的失误。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐