声明: 该博客中部分内容图片取自狂神说、菜鸟教程以及其他资料的相关内容。
Nginx 由俄罗斯访问量第二的rambler.ru站点设计开发的,首次发布于2004年10月,是一个高性能的HTTP和反向代理的web服务器,其主要特点为占用内存少,并发能力强,官方测试数据表明能支持50000各并发连接数的响应。安装简单、配置文件简洁(支持perl语法),而且可以做到24小时不间断运行,在不间断服务的情况下进行软件升级。
国内使用nginx的公司很多,如:百度、京东、新浪、淘宝等,虽然前端用到nginx的地方不是很多,大多只是配置个反向代理,但还是有必要学习一下nginx。
正向代理,是指客户端将请求发送给服务器,由于服务器在外网或其他原因,导致无法访问时,通过向代理服务器发送请求,并指真正的服务器地址,然后代理服务器代替客户端将请求发送给真正的服务器,返回值也是通过代理服务器进行传递。
特点:此时客户端知道真正的服务器IP,但服务端不知道客户端的IP,只知晓代理服务器的IP。因为与服务器进行交互的全都是代理服务器,相当于代理了客户端的身份,隐藏了客户端,解决了访问限制的问题。
常见应用:翻qiang、解决跨域问题等。
反向代理,是指客户端直接将请求发送到代理服务器,然后由代理服务器根据配置的规则,将请求转发到真正要请求的服务器,服务器将结果返回给代理服务器,再由代理服务器返回给客户端。
特点:此时客户端不知道真正的服务器IP,只知道代理服务器的IP,服务器只知道代理服务器的IP,而不知道客户端的IP,将客户端和服务器分隔开。客户端并不知道自己访问的是代理服务器,但其交互全部来自代理服务器,相当于代理了服务器的身份,隐藏了真正的服务器。
应用:负载均衡(分布式部署)、内网的安全防护等。
nginx通过反向代理提供的负载均衡策略有两种:内置策略和扩展策略。内置策略包括轮询、加权轮询、Ip hash等。而扩展策略就是天马行空,任何负载均衡算法,都可以使用。
轮询策略: 有多台服务器时,代理服务器将接收的多个请求,按照顺序依次轮着发送给不同的服务器,分担请求压力。
加权轮询策略: 有多台服务器时,在nginx配置文件中通过weight给所有服务器设置权重,权重越大,被分配到请求的可能越大。在代理服务器将接收的多个请求,按照顺序依次轮着发送给不同的服务器时,根据服务器的权重,决定承担的请求压力。
Ip hash策略: 根据客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
动静分离等等…
下载地址:http://nginx.org/en/download.html。 进入下载页,选择自己电脑对应的稳定版本(Stable version),点击下载即可。
以windows系统为例:下载完成后,解压压缩包,得到nginx的相关文件,启动nginx的方法有两种:① 双击文件夹中的 nginx.exe 闪烁一下即可,因为启动过程不明显,其启动失败不易查找原因,所以我更推荐第二种方法。 ② 在该目录下,输入cmd,打开控制台,输入 nginx.exe ,回车执行即可。
进行启动操作后,在浏览器中输入:http://localhost:80 ,如果页面显示下图则说明,nginx启动成功:
补充: 如果在通过方法二启动nginx时,控制台报错:
说明80端口被占用,我们只需要在控制台中输入:netsh http show servicestate
,查看共同进程的ID,然后打开任务管理器,选择服务,找到PID为共同进程的ID的服务,然后右键将其停止,最后在启动nginx即可。
在本地安装好nginx之后,我们可以从conf文件夹中找到名为nginx.conf的配置文件,里面存储的就是nginx的默认配置, 其文件结构如下:
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
#
: 表示注释。
全局块: 位于配置文件最上方,用来配置nginx全局的指令,如允许生成的进程数、日志存放路径等。
events块: 用来配置影响nginx服务器或与用户的网络连接指令,如进程的最大连接数、是否允许同时接受多个网路连接等。
http块: 用来配置代理,缓存,日志定义等绝大数功能和第三方模块配置,内部可包含多个server。
server块: 用来配置虚拟主机的相关参数,如监听端口、监听地址、location等,内部可包含多个location。
location块: 用来配置拦截不同目录下的请求,以及拦截之后的请求转等操作。
前端开发经常操作的就是server块和location块,通过配置server来监听项目的域名(server_name)和端口(listen),并配置location块,来拦截对应url的请求,进行反向代理等操作。
########### 每个指令必须有分号结束。#################
# 全局块
# 配置用户或者组,默认为nobody nobody。
user administrator administrators;
# 允许生成的进程数,默认为1
worker_processes 2;
# 指定nginx进程运行文件存放地址
pid /nginx/pid/nginx.pid;
# 制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别有debug|info|notice|warn|error|crit|alert|emerg
error_log log/error.log debug;
# events 块
events {
accept_mutex on; # 设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; # 设置一个进程是否同时接受多个网络连接,默认为off
worker_connections 1024; # 最大连接数,默认为512
}
http {
include mime.types; # 文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型
#access_log off; # 取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; # 自定义格式
access_log log/access.log myFormat; # combined为日志格式的默认值
sendfile on; # 允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; # 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; # 连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr { # 定义负载均衡设备的资源
server 127.0.0.1:7878 weight=3; # 权重轮询
server 192.168.10.121:3333 backup; # 热备
# down 表示不参与负载
# weight 表示分配权重
# backup 表示热备 在其他机器忙的时候,才会请求热备机器
}
error_page 404 https://www.baidu.com; # 错误页
// 配置虚拟主机
server {
keepalive_requests 120; # 单连接请求上限次数。
listen 4545; # 监听端口
server_name 127.0.0.1; # 监听地址或域名
# 拦截根目录URL下的请求
location / {
root html;
index index.html index.htm;
}
# 请求的目录url正则匹配,~为区分大小写,~*为不区分大小写。
location ~*^.+$ {
#root path; # 虚拟主机的网页根目录
#index vv.txt; # 设置默认首页
proxy_pass http://mysvr; # 设置被代理服务器的URL和端口
}
}
// 配置http server
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
}
# 配置HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem; # ssl证书的pem 文件
ssl_certificate_key cert.key; # ssl证书的key文件
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
location /api {
proxy_set_header Host xapi.xxx.com;
proxy_pass http://10.1.1.25;
}
}
}