1.简介

百度百科:
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

2.正向代理和反向代理

正向代理:在客户端与服务器端之间的服务器,从服务器获取到请求结果然后返回给客户端,客户端获取到的服务端最终地址是最终的服务地址,vpn和各种梯子可以看做正向代理的代表。

反向代理:同正向代理类似,客户端请求首先也是请求到代理服务器,代理服务器然后请求真正的服务,获取响应,然后返回给客户端,但区别是客户端感知的服务端是在代理服务器,获取的最终服务ip地址也是代理服务器的地址。

区别:正向代理是在客户端侧,反向代理是在服务端侧.所以nginx主要做反向代理服务器。

3.nginx基本命令

安装Nginx

yum install nginx

没有可用的软件包,原因是nginx不在第三方yum源中
sudo yum install epel-release

yum update

nginx -s reload 重启
nginx -t 检查配置文件是否有错误
nginx -s quit 保护性的关闭nginx
nginx -s stop 快速关闭nginx
systemctl start nginx
nginx -v 显示nginx的版本号

4.nginx 配置文件说明

1.全局块配置

user nginx;  //配置哪些用户或用户组能够操作nginx
worker_processes 1;  //允许生成的进程数,可以根据cpu数目来进行配置
error_log /var/log/nginx/error.log; //错误日志文件
error_log /var/log/nginx/error.log notice (notice 日志级别)
error_log /var/log/nginx/error.log info (info日志级别)
pid /run/nginx.pid; //nginx进程运行文件存放地址

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

2.events块配置

events {
    accept_mutex on;         //设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept off;       //设置一个进程是否同时接受多个网络连接
    worker_connections 1024; //最大连接数,默认为1024
}

3.http块配置

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'; //日志格式

    access_log  /var/log/nginx/access.log  main; //main为日志格式的名称  /var/log/nginx/access.log为日志文件

    sendfile            on; //防止网络阻塞,当网络阻塞时候,nginx能够帮助客户端重新发送请求
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65; //长连接最长时间
    types_hash_max_size 2048;  //
    gzip                on; //开启自动压缩

    include             /etc/nginx/mime.types; //nginx支持的哪些文件扩展名和文件类型的映射表
    default_type        application/octet-stream; //默认的文件类型

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;


    server{} //可以配置多个server 监听多个端口
    server{} //如监听https 443端口
}

server块配置静态资源访问
location / {  // "/"代表通配符,所有的请求url都会到达此处
    root /usr/local/nginx/html;   //指定静态资源目录
    index index.html index.html;  //如果没有设置主页面,会在这儿的设置中按照顺序找
}

listen 80; //server监听的端口
server_name localhost; //服务名称

proxy_pass http://127.0.0.1:8080;  //反向代理

url配置:
    ~ 表示正则匹配,后面的内容可以是正则表达式匹配
    . 表示任意一个或多个字符
    \. 转义.字符
    | 表示或
    $ 表示结尾
    如
    location ~ \.(html|js|css|imags|png|gif|jpg|jpeg|png|mp4|zip|ppt)${
        root /usr/local/nginx/html;
        index index.html index.htm;
    }
    可以表示静态资源

    location ~\.jsp$ {
            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://127.0.0.1:8889;  //url以jsp结尾的都转发到8889端口
    }

    重写url
    location /api {
        rewrite ^/api/(.\*)$ /$1 break;
        proxy_pass http://localhost:8082
    }

    //  http://localhost:8089/api/user/getUserById/  -> http://8089/user/getUserById/ 并且转发到 http://localhost:8082上

5.集群配置
在http块中配置

upstream xiayuCluster{
    server 127.0.0.1:8089; //三个服务(不要使用localhost否则效率很低)
    server 127.0.0.1:8090;
    server 127.0.0.1:8091;
}

然后在server location proxy_pass中配置

location / {
    proxy_pass http://xiayuCluster;
}

6.负载均衡配置
Nginx默认的路由选择算法是轮询算法,也可以配置权重,在upstream中配置server时写入weight即可

upstream{
    server 127.0.0.1:8089 weight=1;
    server 127.0.0.1:8090 weight=3;
    server 127.0.0.1:8091 weight=6;
}

负载均衡选择算法-iphash,按照请求的hash值进行分配。
在upstream{} 配置中加入,ip_hash;即可

upstream{
    ip_hash;
    server 127.0.0.1:8089;
    server 127.0.0.1:8090;
    server 127.0.0.1:8091;
}

还有第三方依据url进行分配(url_hash)和响应时间进行分配(fair).

7.集群/分布式环境下session处理

session 保持(用户每次请求都请求到同一台机器上,使用ip_hash解决)
session 复制(session在所有服务都存在,缺点是需要广播到所有服务中,网络要求高)
session 共享(使用一台机器作为session管理服务)
存储在redis中间件实现session共享,利用redis集群,也可以使用token。

8.使用Nginx解决跨域问题

当一个域名的网站访问另外一个域名下的资源,浏览器默认是不允许的,为什么浏览器这样做了?这样做可以避免cors跨域攻击。可以在Nginx上设置反向代理进行转发避免跨域访问,还可以设置跨域访问的域名限制。注意下面的配置都是配置在去跨域访问域名的服务器内,如域名A去跨域访问域名B的资源,则需要配置域名B服务器的配置,如果别的域名也跨域访问域名A,那么域名A服务器也可以使用下面的配置进行解决跨域问题。当同一个域名不同端口访问也属于跨域访问。在html页面中使用<img src=""/>不属于跨域访问。

a.设置反向代理
当一个域名下需要访问另外一个域名下的资源时候,前端访问资源的域名只有一个,在nginx代理服务器上做转发。

location /resource {
  proxy_pass http://otherdomain.com/; //或者相同的域名,不同的端口
}

避免跨域访问

b.添加头信息

在nginx.conf配置文件http块中添加跨域访问配置

add_header Access-Control-Allow-Origin *; //允许所有域名跨域访问代理地址
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET; //跨域请求访问请求方式

跨域问题还可在具体应用响应头信息中添加头信息运行跨域访问
header('Access-Control-Allow-Origin:*');//允许所有来源访问

header('Access-Control-Allow-Method:GET');//允许访问的方式
使用jsonp实现跨域访问,该方式需要写回调函数。

03-05 22:29