内容:

1、何为代理

2、nginx的反向代理模块以及使用

3、nginx的负载均衡模块以及使用

一、何为代理

代理,由字面意思可以理解为代为服务的是意思。

代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反向代理。

正向代理:

正常的用户访问站点是客户打开浏览器,然后输入相关的网站进行浏览,其实这就是一个代理的行为,只不过代理的是浏览器,我们通过浏览器来代理请求站点服务,而正向代理服务器可以理解为:

反向代理:反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。

所以,nginx由于起轻量高效的特性,是的其成为了反向代理服务器的热门选择。

二、ngixn的反向代理模块以及使用

ngx_http_proxy_module模块:

1、proxy_pass URL;

Context: location, if in location, limit_except

(1)注意:proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机;

server {

...

server_name HOSTNAME;

location /uri/ {

proxy http://hos[:port];

}

...

}

效果:http://HOSTNAME/uri --> http://host/uri

(2)proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri;

server {

...

server_name HOSTNAME;

location /uri/ {

proxy http://host/new_uri/;

}

...

}

效果:http://HOSTNAME/uri/ --> http://host/new_uri/

(3)如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri; 用户请求时传递的uri将直接附加代理到的服务的之后;

server {

...

server_name HOSTNAME;

location ~|~* /uri/ {

proxy http://host;

}

...

}

效果:http://HOSTNAME/uri/ --> http://host/uri/;

2、proxy_set_header field value;设定发往后端主机的请求报文的请求首部的值;Context: http, server, location,常用于标记客户端的真是IP地址

例:

proxy_set_header X-Real-IP  $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

3、proxy_cache_path:定义可用于proxy功能的缓存;Context: http

proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_

4、proxy_cache zone | off;

指明要调用的缓存,或关闭缓存机制;Context: http, server, location

5、 proxy_cache_key string;

缓存中用于“键”的内容;

默认值:proxy_cache_key $scheme$proxy_host$request_uri;

6、proxy_cache_valid [code ...] time;

定义对特定响应码的响应内容的缓存时长;

定义在http{...}中;

proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;

定义在需要调用缓存功能的配置段,例如server{...};

proxy_cache pxycache;

proxy_cache_key $request_uri;

proxy_cache_valid 200 302 301 1h;

proxy_cache_valid any 1m;

7、proxy_cache_use_stale

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;

Determines in which cases a stale cached response can be used when an error occurs during communication with the proxied server.

8、proxy_cache_methods GET | HEAD | POST ...;

只有标记的相关请求方法才进行缓存

9、proxy_hide_header field;

By default, nginx does not pass the header fields “Date”, “Server”, “X-Pad”, and “X-Accel-...” from the response of a proxied server to a client. The proxy_hide_header directive sets additional fields that will not be passed.

10、proxy_connect_timeout time;

Defines a timeout for establishing a connection with a proxied server. It should be noted that this timeout cannot usually exceed 75 seconds.

默认为60s;

ngx_http_headers_module模块

向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值;

1、add_header name value [always];

添加自定义首部;

例:

add_header X-Via  $server_addr;

add_header X-Accel $server_name;

2、expires [modified] time;

expires epoch | max | off;

用于定义Expire或Cache-Control首部的值;

下面来进行操作效果的演示:

规划:nginx反代的服务IP:10.1.249.75,后端真实服务器IP:10.1.252.235

在ngixn服务器中配置:

修改ngixn的反向代理服务中的配置文件,启动反向代理模式

   location / {#root   /usr/share/nginx/html;proxy_pass http://10.1.252.235;index  index.html index.htm;}
[root@localhost upload]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.1.249.75  netmask 255.255.0.0  broadcast 10.1.255.255inet6 fe80::20c:29ff:fe65:55a6  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:65:55:a6  txqueuelen 1000  (Ethernet)RX packets 9647  bytes 1463932 (1.3 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 1736  bytes 231308 (225.8 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 0  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在真实服务器中提供测试页面:

[root@localhost html]# cat index.html
RS1

在客户端测试,已经成功访问只后端服务器

[root@localhost ~]# curl 10.1.249.75
RS1
[root@localhost ~]# curl 10.1.249.75
RS1

查看真实服务器的访问日志,发现访问的客户段IP是代理服务器的IP:

[root@localhost html]# tail /var/log/httpd/access_log
10.1.249.75 - - [28/Oct/2016:20:10:46 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:46 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:46 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:47 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:47 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:47 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:48 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:48 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:48 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:49 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

有没有办法获取真正的客户端IP呢?答案是肯定的,nginx提供了自身的变量可以提取原始客户的请求报文信息,只需要保留原客户端的真实IP即可

修改nginx的配置文件,添加其中一条命令:proxy_set_header X-Real-IP $remote_addr;

location / {#root   /usr/share/nginx/html;proxy_pass http://10.1.252.235;proxy_set_header X-Real-IP $remote_addr;index  index.html index.htm;}
[root@localhost upload]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost upload]# nginx -s reload

再次测试,并访问日志:

[root@localhost html]# tail /var/log/httpd/access_log
10.1.249.75 - - [28/Oct/2016:20:10:46 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:47 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:47 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:47 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:48 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:48 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:48 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:49 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:16:01 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:16:04 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

发现源IP还是没有变,这是因为httpd的配置文件定义了日志的格式,只需要简单修改日志格式即可,讲%h改为之前nginx定义的报文首部{X-Real-IP}i

LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

再次测试,并访问日志,已经能正确记录远端客户的IP了!

[root@localhost html]# !tai
tail /var/log/httpd/access_log
10.1.249.75 - - [28/Oct/2016:20:10:47 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:48 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:48 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:48 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:10:49 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:16:01 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.249.75 - - [28/Oct/2016:20:16:04 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.252.215 - - [28/Oct/2016:20:19:40 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.252.215 - - [28/Oct/2016:20:19:40 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
10.1.252.215 - - [28/Oct/2016:20:19:41 +0800] "GET / HTTP/1.0" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

三、nginx的负载均衡模块以及使用

与lvs不同的是,nginx在应用层提供了强大的负载均衡的功能,并带有后端服务的健康检查功能。

nginx的负载均衡模块怎么使用?

ngx_http_upstream_module模块 (定义在http上下文)

1、upstream name { ... }

定义后端服务器组,会引入一个新的上下文;Context: http

upstream httpdsrvs {

server ...

server...

...

}

2、server address [parameters];

在upstream上下文中server成员,以及相关的参数;Context: upstream

address的表示格式:

unix:/PATH/TO/SOME_SOCK_FILE

IP[:PORT]

HOSTNAME[:PORT]

parameters:

weight=number

权重,默认为1;

max_fails=number

失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用;

fail_timeout=time

设置将服务器标记为不可用状态的超时时长;

max_conns

当前的服务器的最大并发连接数;

backup

将服务器标记为“备用”,即所有服务器均不可用时此服务器才启用;

down

标记为“不可用”;

3、least_conn;

最少连接调度算法,当server拥有不同的权重时其为wlc;

4、 ip_hash;

源地址hash调度方法;

5、hash key [consistent];

基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者的组合;

作用:将请求分类,同一类请求将发往同一个upstream server;

示例:

hash $request_uri consistent;

hash $remote_addr;

6、keepalive connections;

为每个worker进程保留的空闲的长连接数量;

下面来实验验证:

规划:nginx反代的服务IP:10.1.249.75,后端服务器RS1:10.1.252.235,后端服务器RS2:10.1.252.215

(1)RS1,RS2启动web服务,并提供相关的测试页面

(2)配置nginx的负载均衡:

在httpd段添加:

upstream test {server 10.1.252.235;server 10.1.252.215;
}

(3)启动反向代理模式,并实现负载均衡:

location / {#root   /usr/share/nginx/html;proxy_pass http://test;proxy_set_header X-Real-IP $remote_addr;index  index.html index.htm;}
[root@localhost upload]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost upload]# nginx -s reload

(4)客户端测试,已经可以实现负载均衡功能(默认是轮询rr算法):

[root@localhost ~]# curl http://10.1.249.75
RS1
[root@localhost ~]# curl http://10.1.249.75
RS2
[root@localhost ~]# curl http://10.1.249.75
RS1
[root@localhost ~]# curl http://10.1.249.75
RS2
[root@localhost ~]# curl http://10.1.249.75
RS1
[root@localhost ~]# curl http://10.1.249.75
RS2
[root@localhost ~]# curl http://10.1.249.75
RS1
[root@localhost ~]# curl http://10.1.249.75
RS2

(5)添加权重测试:

  upstream test {server 10.1.252.235 weight=2;server 10.1.252.215;
}
[root@localhost ~]# curl http://10.1.249.75
RS2
[root@localhost ~]# curl http://10.1.249.75
RS1
[root@localhost ~]# curl http://10.1.249.75
RS1
[root@localhost ~]# curl http://10.1.249.75
RS2
[root@localhost ~]# curl http://10.1.249.75
RS1
[root@localhost ~]# curl http://10.1.249.75
RS1
[root@localhost ~]# curl http://10.1.249.75
RS2
[root@localhost ~]# curl http://10.1.249.75
RS1
[root@localhost ~]# curl http://10.1.249.75
RS1

(6)我们知道,lvs的负载均衡调度中,lvs自身并没有对后端服务器进行健康状态检测的机制,也就是说后端服务器挂了还是会照样进行调度,而ngixn则进行健康状态检查。修改配置如下:

  upstream test {server 10.1.252.235 max_fails=3 fail_timeout=10;server 10.1.252.215 max_fails=3 fail_timeout=10;
}

(7)停掉RS1前的测试:

[root@localhost ~]# for i in `seq 10`;do curl http://10.1.249.75;done
RS1
RS2
RS1
RS2
RS1
RS2
RS1
RS2
RS1
RS2

(8)停掉RS1测试:

[root@localhost html]# service httpd stop
Stopping httpd:                                            [  OK  ]
[root@localhost html]#
[root@localhost ~]# for i in `seq 10`;do curl http://10.1.249.75;done
RS2
RS2
RS2
RS2
RS2
RS2
RS2
RS2
RS2
RS2

(9)已经自动把RS排除,现在再次恢复RS测试:

[root@localhost ~]# for i in `seq 10`;do curl http://10.1.249.75;done
RS2
RS1
RS2
RS1
RS2
RS1
RS2
RS1
RS2
RS1

  好了nginx的反向代理和负载均衡功能就演示到这里,更多文章请关注 我的博客

转载于:https://blog.51cto.com/6638225/1866970

nginx的反向代理以及负载均衡模块的使用相关推荐

  1. Nginx之反向代理与负载均衡实现动静分离实战

    Nginx之反向代理与负载均衡实现动静分离实战 什么是反向代理与负载均衡 Nginx仅仅作为Nginx  proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果. 负载均衡指的是 ...

  2. Windos环境用Nginx配置反向代理和负载均衡

    Windos环境用Nginx配置反向代理和负载均衡 引言:在前后端分离架构下,难免会遇到跨域问题.目前的解决方案大致有JSONP,反向代理,CORS这三种方式.JSONP兼容性良好,最大的缺点是只支持 ...

  3. nginx的反向代理及负载均衡

    查看内核版本号: uname  -r 查看Linux发行版本 :cat /etc/issue 或cat /etc/release 查看bash 版本 : bash  --version <?xm ...

  4. nginx(三)反向代理和负载均衡

    nginx(三)反向代理和负载均衡 正向代理概念:比如在学校要上网,在学校内网是一个内网ip,需要连上公网就需要一个正向代理服务器. 反向代理概念: 看下图(Nginx只做请求的转发,后台有多个htt ...

  5. Nginx做反向代理和负载均衡时“X-Forwarded-For”信息头的处理

    转载自:https://blog.51cto.com/wjw7702/1150225 一.概述 如今利用nginx做反向代理和负载均衡的实例已经很多了,针对不同的应用场合,还有很多需要注意的地方,本文 ...

  6. 【网络编程】多个服务器的情况:nginx实现反向代理、nginx基于反向代理实现负载均衡

    如果我们有多个服务器,比如我们只有一个域名:我们可以利用其中一台服务器,通过nginx为这一个域名实现反向代理:进一步,我们可以利用这多台服务器,为这一个域名基于nginx的反向代理实现负载均衡. 文 ...

  7. Nginx-从零开始使用nginx实现反向代理及负载均衡

    文章目录 环境说明 安装Nginx 安装必须的依赖库 3个 源码安装 yum安装 安装nginx 启动Nginx 常用操作命令 使用非root用户启动nginx 搭建应用 Nginx 做反向代理 + ...

  8. nginx实现反向代理及负载均衡

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013144287/article/details/78551398 一.反向代理 1.什么是反向代 ...

  9. Nginx的反向代理与负载均衡--配置Nginx

    前言 Nginx 是一个非常轻量级的服务器,他虽轻但是他最大的优点就是可以承载大量的并发,所以说一般的话很少有用 Node 直接去做服务器让用户去访问的,因为 Node 本身就需要做非 常非常多的事情 ...

最新文章

  1. Sequence在Oracle中的使用
  2. html5 svg 拖拽,SVG拖动
  3. ajax接口一直在重复调用请求是什么原因_为什么RPC超时设置非常重要
  4. COM_TEXT_GET_SWITCH
  5. maven project创建填充项
  6. deep learning入门学习
  7. 数据可视化大屏设计经验分享 【进阶篇】
  8. iOS开发实战小知识点(四)
  9. 使用 GreenSock 来制作 SVG 动画
  10. 2020 农行笔试题——软开
  11. 无线高清会议室终端之Miracast/HDCP
  12. 2106_视频处理与压缩技术_中文综述
  13. RestTemplate源码剖析:Encode
  14. 如何实现受管控的安全文件传输MFT?
  15. 思科三层交换机配置DHCP中继
  16. win7开机弹计算机,win7开机弹出Windows Installer窗口的解决方法
  17. STM32F030软件SPI控制74HC165
  18. python 画隐函数图像 画三维显函数图像
  19. 学计算机的鼓励,鼓励学习的经典语句
  20. Firefox使用技巧

热门文章

  1. GIS地图界面和计算机图形学填充算法
  2. 图解C# Console 输出和Console相关编程复习总结
  3. 图解Flex开发教程
  4. Linux学习之crontab定时任务
  5. 【读书笔记】iOS-NSString的length
  6. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件
  7. Javascript(6)
  8. php ajax实现的二级(多级)联动菜单(2008-10-21,11:36:08)
  9. WINCE注册表应用
  10. 1. 列维过程的混沌及可料表示(1)