Nginx是一款Http Server,支持http、imap、pop3、smtp协议的服务代理。Nginx文档:http://nginx.org/en/docs/
1 虚拟主机
在Nginx服务器中创建不同的目录,然后在Nginx的启动配置文件中将监听的端口请求映射到对应的目录中,从而实现虚拟主机的效果。
http {
server {
listen 80;
server_name www.demo01.com;
root /usr/local/soft/nginx/domains/demo01;
location / {
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html{
root html;
}
}
server {
listen 80;
server_name www.demo02.com;
root /usr/local/soft/nginx/domains/demo02;
location / {
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html{
root html;
}
}
}
location的匹配规则说明:http://nginx.org/en/docs/http/ngx_http_core_module.html#location
2 反向代理
隐藏目标服务器,反向:服务于服务器
http {
server {
listen 80;
server_name localhost;
location / {
proxy_pass 192.168.125.1:9090;
proxy_method POST;
# 添加请求头信息
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_pass后面可以跟一个服务器组,服务器组的配置方法:
http {
upstream servergroup {
server 192.168.125.1:9090;
server 192.168.125.2:9090;
server 192.168.125.3:9090;
}
...
proxy_pass http://servergroup;
...
}
3 负载均衡
负载策略有:wrr(带权重的轮询,默认的)、ip_hash(根据hash值固定目标IP)、least_conn(优先连接数最小、权重越大的)。
另外还有第三方负载均衡策略的module可以安装使用,比如fair(优先选择响应时间快的目标服务器)
http {
upstream servergroup {
least_conn;
server 192.168.125.1:9090 weight=2 maxfails=3 fail_timeout=10;
server 192.168.125.2:9090 weight=1;
server 192.168.125.3:9090 backup;
server 192.168.125.4:9090 down;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://servergroup;
}
}
}
4 HTTP缓存
缓存清理策略:主动过期时间清理、达到最大内存空间清理最少使用的缓存、利用purge主动清理(第三方module,需要手动添加。能够根据url主动清理缓存)
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=demo_cache:50m inactive=10m max_size=1g;
server {
listen 80;
server_name localhost;
location / {
proxy_pass 192.168.125.1:9090;
proxy_cache demo_cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 2m;
# 添加响应头信息
add_header X-Proxy_Cache $upstream_cache_status;
}
}
}
缓存指令说明:http://nginx.org/en/docs/http/ngx_http_core_module.html#location
purge通过url主动清理缓存的配置方法:
http {
server {
...
location ~ /purge(/.*) {
allow all;
proxy_cache_purge demo_cache $host$uri$is_args$args;
}
...
}
}
5 动静分离
将静态资源与应用分开放置,在nginx中可以定义静态资源的路径:
将静态文件放到nginx服务器的目录下面
将静态文件放到location的网络路径下面
将静态文件放到upsteam的负载均衡的服务器定义上面。
nginx中可以配置哪些类型的请求路由到静态资源:
根据静态资源的类型进行路由
根据客户端的类型进行路由
http {
server {
listen 80;
server_name localhost;
location / {
proxy_pass 192.168.125.1:9090;
}
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /usr/local/soft/nginx/data/static;
}
}
}
6 数据压缩
gzip压缩,默认对html进行压缩
其他类型的文件可以自己配置压缩的比值,压缩的类型。
http {
gzip on;
gzip_http_version 1.1; # 定义http最小压缩版本,低于这个版本就不压缩,默认是HTTP/1.1
gzip_comp_lever 3; # 1-9 ,默认是1 ,值越大压缩比越高
gzip_disable "MSIE [1-6\."; # 定义哪些浏览器不打开压缩
gzip_min_length 1k; # 定义小于1k的文件不进行压缩
gzip_buffers 32 4k # 默认是使用32个缓存空间,每个缓存空间大小是4k
gzip_proxied any; # 如果有多个nginx服务器跳转的时候,为了保证压缩正常,需要打开这个any,默认是off关闭状态
gzip_vary on; # 打开在响应头中添加已进行压缩的标识,off关闭
gzip_types text/plain application/json application/javascript application/x-javascript text/css application/xml text/javascript application/x-http-php image/jpeg image/gif image/png;
server {
...
}
7 跨域请求
本质是浏览器的跨域保护机制。在响应头中添加:Access-Control-Allow-Origin: *,来告诉浏览器这个资源允许跨域请求。
7.1 前端方案:jsonp
jsonp底层是利用 javascript、img 标签中的src属性、link 标签中的ref属性来实现跨域访问资源的,因为html的这几个标签引用资源链接不会有浏览器的跨域限制。
$ajax({
url: ,
type: ,
dataType: 'JSONP',
jsonp: 'callback',
jsonpCallback: 'successCallback',
success: function(data) {}
error: function() {}
});
后端的响应代码修改:
return "successCallback("+resultData+")";
7.2 后端方案
① @CrossOrigin
@CrossOrigin
② 注入Spring框架的WebMvcConfigurerAdapter类,重写其中的addCorsMappings方法。
@Configuration
public class CORSConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://192.168.125.1:9090")
.allowedMethods("GET","POST","DELETE","PUT","OPTIONS")
.allowedCredentials(false).maxAge(3600);
}
}
}
}
7.3 nginx两种处理方案
① 将两个域都代理,变成同一个域。前端只访问nginx服务器,由nginx进行资源路由。
http {
server {
listen 80;
server_name localhost;
location /demo01/ {
proxy_pass http://192.168.125.1:9090;
}
location /demo02/ {
proxy_pass http://192.168.125.2:9090
}
}
}
② 在nginx的启动配置文件中的location中将Access-Control-Allow-Origin: *添加到头中。
http {
server {
location / {
# nginx代理的请求端口号
proxy_pass http://192.168.125.1:9091;
# 这个端口的请求都添加以下返回头信息
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,DELETE,OPTIONS';
add_header 'Access-Control-Allow-Header' 'Content-TYpe,*';
}
}
}