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实现跨域访问,该方式需要写回调函数。