nginx 是什么
**Nginx**是一个高性能的HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP服务器。可以管理所有来自客户端和服务端的连接,常用的功能有以下几种:
- 正反向代理服务器
- 动静态资源服务器
- 负载均衡
正方向代理服务器
正向代理:简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。一般需要简单的配置即可
server { listen 80; server_name www.kelen.cc; resolve_timeout 5s; location / { resolver 192.168.8.88; proxy_pass $scheme://$http_host$request_uri; proxy_buffers 256 4k; } access_log off;}
这样我访问www.kelen.cc就可以访问到192.168.8.8的资源了
反向代理:指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为**一个服务器**。
我们可以用反向代理来实现不同域名访问同一服务器下的端口下的项目
server { listen 80; server_name koa.kelen.cc; location / { proxy_pass http://127.0.0.1:8080; }}server { listen 80; server_name kelen.cc www.kelen.cc; location / { proxy_pass http://127.0.0.1:9090; }}
通过上述配置就可以实现二级域名的访问同一服务器下的不同项目
动静态资源服务器
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。
实现配置
server { listen 80; server_name localhost; location / { root e:\wwwroot; index index.html; } # 所有静态请求都由nginx处理 location ~ \.(gif|bmp|swf|css|js)$ { root e:\www\root; } # 所有动态请求都转发给web服务器处理 location ~ \.(jsp|do)$ { proxy_pass http://test; } error_page 500 502 503 504 /50x.html; location = /50x.html { root e:\wwwroot; }}
负载均衡
负载均衡指的是当某个服务器有大量的请求进来时,可以通过负载均衡来把请求分到不同的服务器去处理,提高资源利用率,减轻服务器的压力
常用的有下面几种方法
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
# 核心配置upstream sampleapp { server localhost:8080; server localhost:8081;}server { listen 80; server_name localhost; client_max_body_size 1024M; location / { proxy_pass http://sampleapp; proxy_set_header Host $host:$server_port; }}
权重
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如
upstream sampleapp { server www.server1.com weight=3; server www.server2.com weight=7;}
比如 server2 对应的服务器性能好,权重设置大点,就会分配多的请求给 server2 处理
IP 地址哈希
前述的两种负载均衡方案中,同一客户端连续的 Web 请求可能会被分发到不同的后端服务器进行处理,因此如果涉及到会话 Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要克服上面的难题,可以使用基于 IP 地址哈希的负载均衡方案。这样的话,同一客户端连续的 Web 请求都会被分发到同一服务器进行处理。
upstream sampleapp { ip_hash; server www.server1.com; server www.server2.com;}
最少连接
Web 请求会被转发到连接数最少的服务器上。适用于性能相同的服务器
upstream sampleapp { least_conn; server www.server1.com; server www.server2.com;}