一、nginx简介
1.是什么
Nginx是一款 轻量级 的
Web服务器
、反向代理服务器
,同时也提供了IMAP/POP3/SMTP服务。适用于各种场景,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。能支持高达50,000
个并发连接数。2.能做什么
反向代理,负载均衡,静态文件服务和动态内容处理(动静分离),Nginx支持 热部署,启动简单,可以做到
7*24
不间断运行。几个月都不需要重新启动。
二、正向/反向代理
2.1正向代理
由于防火墙的原因,不能正常访问谷歌,我们可以使用vpn访问,这就是正向代理。正向代理“代理”的是客户端,而且客户端是知道目标的,而目标不知道客户端是通过vpn访问的
2.2反向代理
我们访问淘宝的时候,淘宝内部肯定不是只有一台服务器,它的内部有很多台服务器,那我们进行访问的时候,因为服务器中间 session 不共享,那我们是不是在服务器之间访问需要频繁登录,那这个时候淘宝搭建一个 过渡服务器,对我们是没有任何影响的,我们是登录一次,但是访问所有,这种情况就是 反向代理。对我们来说,客户端对代理是无感知的,客户端不需要任何配置就可以访问,我们只需要把请求发送给 反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。
当使用反向代理时,有时需要设置代理接口来处理某些请求。可以在 Nginx 中使用 location
指令来设置代理接口,例如:
location /api {
proxy_pass http://backend/;
}
三、负载均衡
-
轮询(默认方法)可配置权重(加权轮询)
- 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器
down
掉,能 自动剔除。
适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群。
weight权重(加权轮询)
指定轮询几率,weight 和 访问比率成正比,用于后端服务器性能不均的情况。
这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。weight 和 访问比率 成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大
- 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器
-
ip_hash
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
- 我们可以采用
ip_hash
指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip
的hash
结果分配,这样每个访客固定访问一个后端服务器,可以解决session
的问题。
- 我们可以采用
-
最少连接
将请求发送到当前连接数最少的服务器上。
-
URL 哈希:
将客户端的 URL 地址作为哈希函数的参数,然后将请求分发到哈希值对应的服务器上。
要指定负载均衡策略,可以在 upstream
的配置中设置,例如:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# IP 哈希
ip_hash;
# 最少连接
# least_conn;
# URL 哈希
# hash $request_uri consistent;
}
四、动静分离
动静分离,在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、 js 等文件),这些不需要经过后台处理的文件称为 静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开,动态资源做好了拆分以后,我们就可以根据 静态资源 的特点将其做缓存操作,以提高资源的响应速度。
Nginx的 静态处理 能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。
- 动静分离技术其实是采用代理的方式,在 server{} 段中加入带正则匹配的 location 来指定匹配项;
- 针对PHP的动静分离:静态页面交给 Nginx 处理,动态页面交给 PHP-FPM 模块或 Apache 处理。在Nginx的配置中,是通过 location 配置段 配合 正则匹配 实现静态与动态页面的不同处理方式
Nginx 可以非常方便地部署静态资源,例如 JavaScript、CSS、HTML 文件等。只需要在 Nginx 的配置文件中添加一个配置项 location,将请求重定向到静态资源所在的目录即可。例如:
server {
listen 80 default_server; # 监听端口号 80
root /usr/share/nginx/html; # 静态资源所在目录
index index.html; # 默认索引页
location / {
try_files $uri $uri/ =404; # 根据 URL 请求寻找对应静态资源
}
}
这里将所有请求重定向到 /usr/share/nginx/html 目录,根据 URL 请求自动寻找对应静态资源。如果找不到对应文件,则返回 404 错误。
五、web 缓存
缓存,是 Nginx 提供的,可以加快访问速度的机制,说白了,在配置上就是一个开启,同时指定目录,让缓存可以存储到磁盘上。
六、Nginx 安装
Nginx的跨平台的,因此,在任何平台都是可以下载的;官网 下载。
6.1windows版本下的安装
1.安装稳定版本
2.启动
- 启动方式一:双击
nginx.exe
,双击后可能没有反应,但是nginx已经打开 - 启动方式二:打开
cmd
命令窗口,切换到 nginx 解压目录下,输入命令nginx.exe
,回车即可
3.检查是否安装成功并访问
地址 :http://localhost:80
为什么是80端口?因为nginx的配置文件监听的是80端口,如果需要修改端口,则修改此端口即可,修改完不需要重启tomcat,只需要执行命令
nginx -s reload
配置就能生效
4.关闭Nginx
方法一:
nginx -s stop (快速停止nginx )
nginx -s quit (完整有序的停止nginx )
区别:前者可能会导致数据没有完全保存
方法二:
使用 taskkill /f /t /im nginx.exe
taskkill
: 是用来终止进程的/f
: 是强制终止/t
:终止指定的进程和任何由此启动的子进程/im
:指定的进程名称 .
6.2 Linux版本下的安装
1.安装包下载
2.上传到linux服务器
3.解压
tar -zxvf nginx-1.24.0.tar.gz
4.配置
进入nginx目录
#依次输入
./configure
make
make install
查找安装路径 whereis nginx
5.启动
进入目录 /usr/local/nginx/sbin/
, 再输入 ./nginx
启动
访问:80即可
如果启动不成功关闭防火墙
开启service firewalld start
重启service firewalld restart
关闭service firewalld stop
查看防火墙规则firewall-cmd --list-all
查询端口是否开放firewall-cmd --query-port=8080/tcp
开放80端口firewall-cmd --permanent --add-port=80/tcp
移除端口firewall-cmd --permanent --remove-port=8080/tcp#重启防火墙(修改配置后要重启防火墙)firewall-cmd --reload
参数解释1、firwall-cmd:是Linux提供的操作firewall的一个工具;2、–permanent:表示设置为持久;3、–add-port:标识添加的端口;
七、常用命令
cd /usr/local/nginx/sbin/
./nginx # 启动
#快速关闭Nginx,可能不保存相关信息,并迅速终止web服务
nginx -s stop
#平稳关闭Nginx,保存相关信息,有安排的结束web服务
nginx -s quit
#因改变了Nginx相关配置,需要重新加载配置而重载
nginx -s reload
#重新打开日志文件
nginx -s reopen
#为 Nginx 指定一个配置文件,来代替缺省的
nginx -c filename
#不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件
nginx -t
#显示 nginx 的版本
nginx -v
#显示 nginx 的版本,编译器版本和配置参数
nginx -V
#格式换显示 nginx 配置参数
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua
八、配置文件详解
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on(惊群现象:一个请求过来,多个服务被唤醒)
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#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;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}