Nginx是一个高性能的HTTP和反向代理web服务器,它能够提供静态文件服务、负载均衡、HTTP缓存、SSL终端代理、Gzip压缩等功能。
Nginx支持热部署,启动简单,可以做到7*24不间断运行。几个月都不需要重新启动。
Nginx的反向代理(扩展:正向代理)
正向代理: 浏览器中配置代理服务器
反向代理: 在服务器中配置代理服务器,客户端对代理是无感知的,客户端不需要任何配置就可以访问。此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。
Nginx的负载均衡
负载均衡简单来说就是:现有的请求使服务器压力太大无法承受,我们需要搭建一个服务器集群,去分担原先一个服务器所承受的压力,那现在我们有ABCD等等多台服务器,我们需要把请求分给这些服务器,但是服务器可能大小也有自己的不同,所以怎么分?如何分配更好?又是一个问题。
Nginx给出来三种关于负载均衡的方式:
轮询法(默认方法): 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群。
weight权重模式(加权轮询): 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的 情况。 这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。weight和访问比率成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大
ip_hash: 在负载均衡系统中,假如用户在第二次请求的时候,会重新定位服务器,其登录信息session将会丢失。 ip_hash指令解决了这个问题,如果客户曾经访问了某个服务器,当用户再次访问时,会通过哈希算法,自动定位到该服务器。按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session丢失的问题。
Nginx的动静分离:
Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。
下面是在Java项目中使用Nginx的一些实际代码示例:
- 配置Nginx反向代理
假设Java应用部署在本机的8080端口,可以通过Nginx反向代理进行访问。在Nginx的配置文件(一般是nginx.conf)中加入以下内容:
# 定义upstream,将请求转发到Java应用的8080端口
upstream backend {
server 127.0.0.1:8080;
}
# 定义server,将所有请求都转发到upstream
server {
listen 80;
server_name myapp.com;
location / {
proxy_pass http://backend;
}
}
- 开启HTTP缓存
可以使用Nginx的缓存功能对Java应用返回的静态资源进行缓存,减轻Java应用的负担。在Nginx的配置文件中加入以下内容:
# 定义缓存的路径和过期时间
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myapp-cache:10m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 304 10m;
# 配置location,开启缓存并设置缓存的路径和名称
location /static/ {
proxy_cache myapp-cache;
proxy_cache_valid 200 1d;
proxy_cache_bypass $http_pragma;
proxy_cache_revalidate on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ignore_headers Cache-Control;
}
- 开启SSL终端代理
可以使用Nginx作为SSL终端代理,将SSL请求转发给Java应用进行处理。在Nginx的配置文件中加入以下内容:
# 定义证书和私钥的路径和文件名
ssl_certificate /etc/nginx/certs/myapp.crt;
ssl_certificate_key /etc/nginx/certs/myapp.key;
# 配置server,开启SSL和SSL终端代理,并将请求转发到Java应用
server {
listen 443 ssl;
server_name myapp.com;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ssl_session_reuse on;
proxy_ssl_verify off;
}
}
以上是Nginx在Java项目中的一些实际代码示例,其中还包括一些高级用法,如负载均衡、Gzip压缩等。