Nginx实现端口转发

Nginx实现端口转发

Scroll Down

什么是端口转发

当我们在服务器上搭建了一个博客应用,一个爬虫应用,其中博客启动了8001端口,爬虫应用启动了8002端口,此使,我们可以通过

localhost:8001 //博客应用
localhost:8002 //爬虫应用

但我们一般访问应用的时候都是希望使用我们的二级域名去访问,并且域名后面不加端口,即

blog.xxx.com //博客应用
crawler.xxx.com //爬虫应用

但我们的二级域名是和我们的一级域名所在的服务器的80端口绑定的。这时候如何该怎么办呢?一个常用的方法是用 Nginx 进行端口转发。

Nginx 的实现原理是:用 Nginx 监听你的应用所在的服务器的80端口,当有HTTP请求到来时,将HTTP请求的HOST等信息与其配置文件进行匹配并转发给对应的应用。例如当用户访问 blog.xxx.com 时,Nginx从配置文件中知道这个是博客应用的HTTP请求,于是将此请求转发给8001端口的应用处理。当用户访问crawler.xxx.com 时,Nginx从配置文件中知道这个是爬虫应用的HTTP请求,于是将此请求转发给8002端口的应用处理。一个Nginx配置文件(nginx.conf)如下面所示:

events {
 #仅对指定的客户端输出debug级别的日志: 语法:debug_connection[IP|CIDR]
 #这个设置项实际上属于事件类配置,因此必须放在events{……}中才会生效。它的值可以是IP地址或者是CIRD地址。
 	#debug_connection 10.224.66.14;  #或是debug_connection 10.224.57.0/24
 #这样,仅仅以上IP地址的请求才会输出debug级别的日志,其他请求仍然沿用error_log中配置的日志级别。
 #注意:在使用debug_connection前,需确保在执行configure时已经加入了--with-debug参数,否则不会生效。
	worker_connections  1024;
}
 
http {
##嵌入其他配置文件 语法:include /path/file
#参数既可以是绝对路径也可以是相对路径(相对于Nginx的配置目录,即nginx.conf所在的目录)
    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监听的端口
#语法:listen address:port [ default(deprecated in 0.8.21) | default_server | [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ] ]
#default_server: 如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个server块作为默认server块
	listen       8080;

#主机名称:其后可以跟多个主机名称,开始处理一个HTTP请求时,nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由那一个server来处理这个请求。有可能一个Host与多个server块中的server_name都匹配,这时会根据匹配优先级来选择实际处理的server块。server_name与Host的匹配优先级见文末。
	 server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}
 
##location 语法: location [=|~|~*|^~] /uri/ { ... }
# location的使用实例见文末。
#注意:location时有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会被第一个location处理。
	location / {
	proxy_pass http://192.168.1.60;
        }
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
 
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
 
 
 
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
 
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
 
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
 
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
 
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
}

Nginx实现端口转发

Nginx实现端口转发需要在配置文件中修改server块中的内容。你可以根据自己的需要来添加server块。**如果你的服务部署在远程服务器上,只需将127.0.0.1替换成你服务器的ip地址即可。**端口转发有四种情况,此处列出常用的两种:

  • 访问ip转发到ip+端口
server{
  listen  80;
  server_name  127.0.0.1;
  index  index.php index.html index.htm;

  location / {
     proxy_pass  http://127.0.0.1:8001;
  }
}

当访问127.0.0.1:80的时候,就会转发到127.0.0.1:8001端口,此使就可以成功访问我们的博客应用了。

  • 访问域名转发到IP+端口去
server{
  listen 80;
  server_name  blog.xxx.com;
  index  index.php index.html index.htm;

  location / {
     proxy_pass  http://127.0.0.1:8001;
  }
}

当访问blog.xxx.com的时候,就会转发到127.0.0.1:8001端口,此使就可以成功访问我们的博客应用了。