精华内容
下载资源
问答
  • 前言 前段时间给朋友开发网站, 上线几个月后想要接入支付宝在线支付. 支付宝接口申请需要给一个已经上线... 之前接触过一点点nginx, 便想通过nginx实现同一台云服务器/相同端口(80)通过域名做请求转发. 准备工作

    前言


    前段时间给朋友开发网站, 上线几个月后想要接入支付宝在线支付. 支付宝接口申请需要给一个已经上线的网站. 由于一些原因, 朋友的网站没有申请通过, 现需用B2C网站做申请之用. 但是已上线的站点不能停用, 本着节约成本的原则, 我拒绝了他再去租用一台云服务器. 之前接触过一点点nginx, 便想通过nginx实现同一台云服务器/相同端口(80)通过域名做请求转发.

    准备工作


    1. 准备nginx, nginx-1.12.2
    2. 准备sunny ngrok, 并下载相应客户端版本, 用于模拟两个域名
    3. 准备两个服务器(当前环境:Tomcat7.0.59 & php7+apache2.4), 也可以使用两个tomcat服务器

    配置内网穿透


    在sunny ngrok申请两个账号, 同时映射到 localhost:8081:
    第一个账号配置
    第二个账号配置
    并在本地启用内网穿透:
    开启本地映射

    配置nginx


    hyong.free.ngrok.cchyong2.free.ngrok.cc监听端口同时映射到8081(与SunnyNgrok配置一致即可)

    worker_processes  1;
    events {
        worker_connections  1024;
    }
    
    http {
        include             mime.types;
        default_type        application/octet-stream;
        sendfile            on;
        keepalive_timeout   65;
    
        #gzip  on;
    
        # 配置第一个代理规则
        # 域名: hyong.free.ngrok.cc
        # 监听端口: 8081
        server {
            listen              8081;
            server_name         hyong.free.ngrok.cc;
            location / {
                root            I:/php/httpd-2.4.26-Win64-VC15/Apache24/htdocs;
                index           index.php index.html;
                proxy_pass      http://127.0.0.1:8080;
            }
        }
    
        # 配置第二个代理规则
        # 域名: hyong2.free.ngrok.css
        # 监听端口: 8081, 端口与第一个规则相同
        server {
            listen              8081;
            server_name         hyong2.free.ngrok.cc;
            location / {
                root            I:\java-working\server\apache-tomcat-7.0.59;
                index           index.jsp index.html;
                proxy_pass      http://127.0.0.1:9000;
            }
        }
    }

    接下来启动nginx中文网:
    启动nginx
    nginx for windows相关命令
    cmd> cd nginx_home:

    命令说明
    start nginx后台启用nginx, 前台启动(cmd>nginx.exe)
    nginx -s stop快速停止
    nginx -s quit安全停止
    nginx -s reload改变配置,开始新的工作进程与新配置,优雅的关闭旧的工作进程
    nginx -s reopen重启, 重启日志文件

    校验nginx启动是否成功: tasklist /fi "imagename eq nginx.exe"
    校验nginx是否启动

    启动服务器


    视情况而定, 当前启动 Tomcat&Apache

    测试验证


    访问 http://hyong.free.ngrok.cc
    这里打个小广告

    访问 http://hyong2.free.ngrok.cc
    第二套环境

    漂亮: 测试通过!!!

    总结


    1. nginx并未使用在真实项目中, 因此对nginx并未深入研究
    2. 除了负载均衡(个人觉得应该叫并发瓶颈转移), 还可以做请求转发
    3. 经过本次测试, 发现nginx还具有端口路由的功能. 此后做web开发时, 就可以同时对外提供多个相同端口的不同服务了 ^ - ^

    如果发现本文内容有误, 欢迎留言讨论…

    展开全文
  • 监控IPv4和IPv6下的相同端口

    千次阅读 2021-06-15 23:09:46
    同时监控双栈(IPv4栈、IPv6栈)下的指定端口号实现上也比较简单,分别创建两个套接字: 一个用来监听IPv4端口 一个用来监听IPv6端口 只是这里面有一个需要注意的地方: 创建两个UDP套接字,分别监听IPv4,IP...

     

    如今,随着网络的日益普及,IPv4地址数量相对于与日俱增的网络设备而言,简直太稀缺了,已经远远无法满足日常需求,因此出现了IPv6协议,并开始逐渐向IPv6进行过渡。在如今的过渡阶段中,网络环境中同时存在IPv4网络和IPv6网络,因此开发软件时通常要求支持双栈的功能

    同时监控双栈(IPv4栈、IPv6栈)下的指定端口号实现上也比较简单,分别创建两个套接字:

    • 一个用来监听IPv4端口
    • 一个用来监听IPv6端口

    只是这里面有一个需要注意的地方:

    创建两个UDP套接字,分别监听IPv4,IPv6端口,不存在特别的问题。但是TCP却不同,如果先创建并绑定IPv4的端口,则另一个套接字无法直接绑定IPv6的相同端口。会提示如下信息:

    bind failed: : Address already in use
    

    此时需要设置IPv6套接字的高级选项(IPPROTO_IPV6)方可以进行绑定和监听:

    static const int on = 1;
    setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,(const void *)&on, sizeof(on))

    UDP无需此项参数设置,具体原因未知。

    完整代码实现如下(包括udp, tcp监控双栈代码):

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <string.h>
    
    int creatSocketUdp(char *ip, short port)
    {
    	static const int on = 1;
    	
    	int fd;
    	struct sockaddr_in server;
    	
    	if ((fd = socket(AF_INET, SOCK_DGRAM, 0))<0){
    		perror("creatSocketUdp_v6 create socket failed: ");
    		return -1;
    	}else if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on))<0){
    		perror("creatSocketUdp_v6 set REUSEADDR failed: ");
    		return -1;
    	}
    	
    	bzero(&server, sizeof(server));
    	server.sin_family = AF_INET;
    	server.sin_port = htons(port);
    	server.sin_addr.s_addr = htonl(INADDR_ANY);
    
    	int ret = bind(fd, (struct sockaddr *)&server, sizeof(server));
    	if (ret != 0){
    		perror("creatSocketUdp_v6 bind failed: ");
    		return -1;
    	}
    	return fd;
    }
    
    int creatSocketUdp_v6(char *ip, short port)
    {
    	static const int on = 1;
    	
    	int fd;
    	struct sockaddr_in6 server;
    	
    	if ((fd = socket(AF_INET6, SOCK_DGRAM, 0))<0){
    		perror("creatSocketUdp_v6 create socket failed: ");
    		return -1;
    	}else if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on))<0){
    		perror("creatSocketUdp_v6 set REUSEADDR failed: ");
    		return -1;
    /*	}else if(setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,(const void *)&on, sizeof(on))<0){
    		perror("creatSocketUdp_v6 set REUSEADDR failed: ");
    		return -1; */
    	}
    	
    	bzero(&server, sizeof(server));
    	server.sin6_family = AF_INET6;
    	server.sin6_addr = in6addr_any;
    	server.sin6_port = htons(port);
    	
    	int ret = bind(fd, (struct sockaddr *)&server, sizeof(server));
    	if (ret != 0){
    		perror("creatSocketUdp_v6 bind failed: ");
    		return -1;
    	}
    	return fd;
    }
    
    
    int creatSocketTcp(char *ip, short port)
    {
    	static const int on = 1;
    	
    	int fd;
    	struct sockaddr_in server;
    	
    	if ((fd = socket(AF_INET, SOCK_STREAM, 0))<0){
    		perror("creatSocketTcp create socket failed: ");
    		return -1;
    	}else if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on))<0){
    		perror("creatSocketTcp set REUSEADDR failed: ");
    		return -1;
    	}
    	
    	bzero(&server, sizeof(server));
    	server.sin_family = AF_INET;
    	server.sin_port = htons(port);
    	server.sin_addr.s_addr = htonl(INADDR_ANY);
    
    	int ret = bind(fd, (struct sockaddr *)&server, sizeof(server));
    	if (ret != 0){
    		perror("creatSocketTcp bind failed: ");
    		return -1;
    	}
    	
    	if (listen(fd, 5)<0){
    		perror("creatSocketTcp listen failed: ");
    		return -1;
    	}
    	return fd;
    }
    
    int creatSocketTcp_v6(char *ip, short port)
    {
    	static const int on = 1;
    	
    	int fd;
    	struct sockaddr_in6 server;
    	
    	if ((fd = socket(AF_INET6, SOCK_STREAM, 0))<0){
    		perror("creatSocketTcp_v6 create socket failed: ");
    		return -1;
    	}else if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on))<0){
    		perror("creatSocketTcp_v6 set REUSEADDR failed: ");
    		return -1;
    	}else if(setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,(const void *)&on, sizeof(on))<0){
    		perror("creatSocketTcp_v6 set REUSEADDR failed: ");
    		return -1; 
    	}
    	
    	bzero(&server, sizeof(server));
    	server.sin6_family = AF_INET6;
    	server.sin6_addr = in6addr_any;
    	server.sin6_port = htons(port);
    	
    	int ret = bind(fd, (struct sockaddr *)&server, sizeof(server));
    	if (ret != 0){
    		perror("creatSocketTcp_v6 bind failed: ");
    		return -1;
    	}
    
    	if (listen(fd, 5)<0){
    		perror("creatSocketTcp_v6 listen failed: ");
    		return -1;
    	} 
    	return fd;
    }
    
    void main(int argc, char** argv)
    {
    	char buf[1024] = {0};
    	int buflen = 0;
    	int clientLen = 0;
    	
    	struct sockaddr client;
    	int ret = 0;
    	int fd ;
    	int fd6;
    
    	if (argc != 2){
    		printf("Usage: ./a.out tcp|udp\n");
    		return ;
    	}else if(strstr(argv[1],"udp")){
    		fd = creatSocketUdp(NULL, 8080);
    		if(fd < 0){
    			printf("%s:%d error\n", __func__, __LINE__);
    			return ;
    		}
    		fd6 = creatSocketUdp_v6(NULL, 8080);
    		if(fd < 0){
    			printf("%s:%d error\n", __func__, __LINE__);
    			return ;
    		}
    	}else if(strstr(argv[1],"tcp")){
    		fd = creatSocketTcp(NULL, 8080);
    		if(fd < 0){
    			printf("%s:%d error\n", __func__, __LINE__);
    			return ;
    		}
    		fd6 = creatSocketTcp_v6(NULL, 8080);
    		if(fd6 < 0){
    			printf("%s:%d error\n", __func__, __LINE__);
    			return ;
    		}
    	}else{
    		printf("Usage: ./a.out tcp|udp\n");
    		return ;
    	}
    	
    	bzero(&client, sizeof(client));
    	fd_set readfds;
    	int maxFD = 0;
    	struct timeval timeVal;
    	
    	while(1){
    		FD_ZERO(&readfds);
    		FD_SET(fd, &readfds);
    		FD_SET(fd, &readfds);
    		
    		maxFD = fd6 > fd ? fd6:fd;
    		timeVal.tv_sec = 1;
    		timeVal.tv_usec = 0;
    		
    		ret = select(maxFD, &readfds,NULL,NULL,&timeVal);
    		if (ret == 0){
    			printf("【Timeout!!!】\n");
    			continue;
    		}else if (ret < 0){
    			perror("Whack Fucking error??? :");
    			break;
    		}else{
    			if (FD_ISSET(fd, &readfds)){
    				buflen = recvfrom(fd, buf, 1024, 0, (struct sockaddr *)&client, &clientLen);
    				if(buflen>0){
    					printf("【recv packet v4】: %s\n", buf);
    					sendto(fd, buf, buflen, 0, (struct sockaddr *)&client, clientLen);
    				}
    			}else if(FD_ISSET(fd, &readfds)){
    				buflen = recvfrom(fd, buf, 1024, 0, (struct sockaddr *)&client, &clientLen);
    				if(buflen>0){
    					printf("【recv packet v6】: %s\n", buf);
    					sendto(fd, buf, buflen, 0, (struct sockaddr *)&client, clientLen);
    				}
    			}
    		}
    	}
    	
    }
    展开全文
  • #同时监听相同端口,可以通过匹配server_name 来决定最终匹配哪个server  #server1  server {  listen 80;  #server_name localhost;  location / {  rewrite / http://www.baidu.com;  ...

     #同时监听相同端口,可以通过匹配server_name 来决定最终匹配哪个server
        #server1
        server {
            listen       80;
            #server_name  localhost;

            location  / {
                rewrite / http://www.baidu.com;
            }                
        }    
        #server2
        server {
            listen       80;
            #uc-center.m.szy.net 在本地的hosts文件 解析到 127.0.0.1
            server_name  uc-center.m.szy.net;

            location  ~* ^\/(.*)$ {
               rewrite ^\/(.*)$ http://www.sina.com;        
            }                
        }

       例如:  访问   http://uc-center.m.szy.net  不会因为server1的配置,而导致跳转到“百度首页”。
                  nginx会优先匹配 配置有server_name的server2,最终跳转到"新浪首页"

    展开全文
  • 一个外网IP如何能映射两台机子的相同端口(NAT) 只需要将内网的两台主机映射为外网的不同的两个端口即可。 比如需要将主机A和主机B 的http(80)端口映射到外网,外网地址为103.23.26.31。可以如下...

    一个外网IP如何能映射两台机子的相同端口(NAT)

    只需要将内网的两台主机映射为外网的不同的两个端口即可。

    比如需要将主机A和主机B 的http(80)端口映射到外网,外网地址为103.23.26.31。可以如下操作:

    1. 将主机A的443端口映射为103.23.26.31:4430;(即将主机A的443端口映射为4430端口)

    2. 将主机B的443端口映射为103.23.26.31:4440;(即将主机B的443端口映射为4440端口)


    由此可得:nat是将Ip延长为ip+port。一个内网中,nat路由器只能将65536个应用端口映射成功(端口来自不同的内网ip的应用)。
    展开全文
  • Docker多个容器不能有相同端口

    千次阅读 2020-03-06 23:11:01
    在docker里用同一份镜像创建4个容器,网络选择bridge模式,A服务在四个容器中都使用了同一个端口号(6000);为了减少对外暴露的端口数,另外使用了nginx对这4个服务实例做代理,4个服务实例分属4个upstream,使用了...
  • 导致出现很多相同端口的UDP套接字的原因有两点:  1)在reload的时候,调用shutdown()而不是close()来关闭UDP套接字。shutdown()是用来关闭连接的,但是文件描述符还是会存在。UDP协议并没有提供shutdown接口(参见...
  • #将域名为m.baidu.com的请求分发到本地81端口的服务 } } server { listen 80; proxy_set_header X-Real-IP $remote_addr; #记录远程访问ip,方便应用中获取 server_name admin.baidu.com; #将域名为m.baidu....
  • 操作系统负责把传递到内部的数据适当分配给套接字,这时就利用端口号,也就是说,通过NIC接收的数据内有端口号,操作系统正式参考此端口号把数据传输给相应端口的套接字,而套接字的类型有分为TCP面向连接的套接字和...
  • 1、Nginx配置文件如下: #user nobody; worker_processes 3; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid;... worker_c...
  • 一台机器上,配置了多个IP,有多个应用,他们要使用相同端口,这样能实现吗?比如,IIS和tomcat并行运行,没有任何集成,他们分别侦听各自的IP,都是80端口,这样可行吗?我用java做了本地的测试,机器上给一个网卡...
  • TCP和UDP可以同时监听相同端口

    千次阅读 2020-03-16 12:48:39
    TCP和UDP可以同时监听相同端口吗 同一台机器的同一个端口只可以被一个进程使用,一般用于tcp,或者udp。那一个进程使用同一个端口同时监听tcp、udp请求,是否可以呢? 答案:可以。 端口可以形象地比喻成操作...
  • TCP和UDP可以同时监听相同端口

    千次阅读 2020-08-27 21:47:30
    TCP和UDP可以同时监听相同端口吗(可以) IP数据包首部有个叫做协议的字段,指出了上层协议是TCP还是UDP还是其他。操作系统有能力根据接受的报文的IP字段里面的协议部分判断这个报文是什么报文,就是说,系统读数据...
  • TCP和UDP可以使用相同端口号; TCP协议里的端口号必须是唯一的,UDP同理; 原因: IP首部中存入一个长度为8bit的数值,称作协议域。1代表ICMP,2代表IGMP,6代表TCP,17代表UDP。系统有能力根据接受的报文的IP...
  • 不同的套接字可以共用相同端口号吗?(在不同主机上自然可以,下面讨论在同一台主机上的情况。) 需要分情况而看,套接字分为UDP套接字和TCP套接字,对于前者,其由(ip地址,端口号)来标识,后者由(源ip,源端口...
  • Nginx 配置文件注意点 端口配置 监听的端口不能被其他的进程占用,比如8080端口如果...当在/etc/nginx/conf.d/目录下有多个Nginx配置文件,且监听的端口相同时,会优先选择配置了匹配的server_name且值不为localho
  • 相同ip不同端口跳转问题

    千次阅读 2018-12-11 23:30:57
    同一个ip下不同端口的两个服务,跳转出现问题。实际上在一个浏览器下同时登陆也做不到。 原帖:https://blog.csdn.net/snoweaglelord/article/details/81222347 本人服务器上1个tomcat,一个weblogic测试有效可以...
  • 具有相同相位差的新型双频带六端口电路
  • 如果在路由器的两个端口上配置相同的网段,则要用桥接模式。    这里提到了一个概念,即网桥组(Bridge-Group)。要实现不同的端口之间的桥接交换,必须将这些端口归到同一个网桥组当中。从概念上说,配置为同一...
  •  本地测试流程:两个相同的应用,代码完全相同;只是部署在两个不同的tomcat;域名都是localhost应用A:部署在http://localhost:8087/应用B:部署在http://localhost:8089/在intelj idea中很简单,建立两个不同的...
  •  不同协议相同端口使用并不冲突;所以我们要只获得TCP或UDP协议的的端口情况: 上图是TCP端口使用情况,通过使用管道和 egrep 命令。在上图显示中可以看出端口显示在每行的第四列,那么先获得第四列: 观察上...
  • 给出一张拓扑图,让交换机上每一个连接pc的接口都被shutdown。 实现方法 方法一:配置临时端口组 ...当我们退出了端口组模式的时候,这个时候咱们之前创建的端口组就不在存在。但是在之前创建...
  • tcp和udp端口号是否可以相同

    千次阅读 2020-02-08 19:02:59
    tcp和udp可以使用相同的port号 且 tcp和udp可以同时使用相同的port号 但一台设备里, tcp协议里port号必须有唯一性。 同样, udp协议里port号必须有唯一性。 OS接收到报文后,根据IP字段里面的内容可以区分出是什么...
  • TCP 和 UDP 能否使用相同端口号?

    万次阅读 2015-12-11 15:14:01
    答案:可以。 参考: http://stackoverflow.com/questions/6437383/can-tcp-and-udp-sockets-use-the-same-port Yes, you can use the same port number for both TCP and UDP. Many protocols already do ...
  • Android 一个线程通过WebVew(URL)获取网页视频,另一个线程通过socket发送命令出去。URL解析出来的 IP地址与socket的IP地址相同端口号不同。视频可以获取,发送命令一直阻塞在socket初始化。
  • Linux 端口号划分

    万次阅读 2012-12-02 10:47:24
    1、0~1023,这些端口有IANA分配和控制,可能的话,相同端口号就分配给TCP、UDP和SCTP的同一给定服务。如80端口被赋予web服务 2、1024~49151,这些端口不受IANA控制,不过由IANA登记并提供他们的
  • 现在已有可用ip,端口为80,增设一个8080的端口的虚拟主机1.增加监听端口:Listen 80Listen 80802.在原有ServerName 下面增加 虚拟主机端口:ServerName localhost:80NameVirtualHost localhost:80803.增加虚拟主机...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 472,882
精华内容 189,152
关键字:

相同端口