介绍
Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡
优点
-
支持海量高并发,采用IO多路复用epoll,实际生产环境可支撑2-4w并发连接数
-
内存消耗少、成本低
-
配置文件简单、跨平台
主要功能
-
正向、反向代理
-
负载均衡、分流
-
虚拟主机(绑定host)
nginx.conf文件结构
# 全局块
# 配置影响nginx全局的指令,比如:
# 1.允许nginx服务器的用户组
# 2.nginx进程pid存放路径
# 3.日志存放日志
# 4.配置文件引入
# 5.允许生成的worker_process数(一般设置为和CPU核数一样)
user nginx;
worker_process 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
# events块
# 配置影响nginx服务器或用户的网络连接,比如:
# 1.每个进程的最大连接数
# 2.选取哪种事件驱动模型处理连接请求
# 3.是否允许同时接受多个网路连接
# 4.开启多个网路连接序列化
worker_connections 1024;
}
http {
# http块,可嵌套多个server
# 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置,比如:
# 1.文件引入
# 2.mime-type定义
# 3.日志自定义
# 4.是否使用sendfile传输文件
# 5.连接超时时间
# 6.单连接请求数
server {
# server块
# 配置虚拟主机的相关参数
location [PATTERN] {
# location块
# 配置请求的路由
}
location / {
root /usr/share/nginx/html; # 服务默认启动目录
index index.html index.htm; # 默认访问文件
}
error_page 404 /404.html; # 配置404页面
error_page 500 502 503 504 /50x.html; # 配置错误状态码显示页面
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
一个配置文件
#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
}
}
}
命令
-
启动 nginx 或systemctl start nginx.service
-
停止 nginx -s stop(立即停止) 或 nginx -s quit (进程完成当前工作后停止)
-
重启 nginx -s reload 或 service nginx reload
-
重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf
-
查看 nginx 版本 nginx -v
-
验证nginx配置文件是否正确nginx -t
正向、反向代理
正向代理
概念:客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转发请求并获取内容返回给客户端。
特点:正向代理是代理服务器代理了客户端,去和目标服务器进行交互,通过正向代理服务器访问目标服务器,目标服务器不知道真正的客户端是谁;一般是由客户端架设的,比如在自己的机器上安装一个代理软件。
场景:访问原来无法访问的资源;提高访问速度,做缓存加速访问的资源;对客户端访问授权;记录用户访问记录,对外隐藏用户信息
反向代理
概念:反向代理服务器接收客户端连接请求,将请求转发到内部网络上的服务器,从服务器得到结果返回到客户端。
特点:反向代理是代理服务器代理了目标服务器,去和客户端进行交互,通过反向代理服务器访问目标服务器时,客户端不知道真正的目标服务器是谁;一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器。
场景:负载均衡,将客户端请求分发到不同的真实服务上;隐藏服务器真实IP;提高访问速度,对静态内容及短时间内有大量访问请求的动态内容提供缓存服务;提供安全保障,可以作为应用层防火墙,提供加密和SSL加速,HTTP访问认证等。
负载均衡
概念:服务器接收到的请求按照规则分发的过程称为负载均衡,负载量就是服务器接收到的来自客户端和nginx反代服务器的请求数量。
nginx负载均衡策略:
- 默认轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动排除故障系统
# constPolling 作为存放负载均衡的变量
upstream constPolling {
server localhost:10001;
server localhost:10002;
}
server {
listen 10000;
server_name localhost;
location / {
proxy_pass http://constPolling; #在代理的时候接入constPolling
proxy_redirect default;
}
}
- 加权轮询:设置weight权值,有效利用主机资源,值越大被访问的概率越高
upstream constPolling {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
- ip_hash:每个请求根据访问ip的hash结果分配,每个访客固定访问同一个后端服务,可以有效解决session共享问题
upstream constPolling {
ip_hash;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
- fair算法:安装upstream_fair模块,fair算法可以根据页面大小和加载时间长短进行负载均衡,响应速度短的优先分配
upstream constPolling {
server localhost:10001;
server localhost:10002;
fair;
}
综合使用场景
- 同一个域名通过不同目录访问子系统,通过配置不同的location指向不同的项目目录代码或者项目启动的服务
server {
# 通过匹配物理路径指向不同项目目录
location /b {
alias /var/www/html/mall/;
index index.html index.html;
}
# 通过代理指向,指向项目服务
location /b/ {
proxy_pass http://127.0.0.1:8082/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
2.自动适配PC/移动端页面
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/pc;
if($http_user_agent ~* '(Andriod|webOS|iPhone|iPod|BlackBerry)') {
root /usr/share/nginx/mobile;
}
index index.html;
}
}
3.前端单页面应用刷新404问题
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html/dist; # vue打包后的文件夹
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
4.权限控制
server {
listen 80;
server_name localhost;
charset utf-8;
# 只可以访问指定的请求,否则返回403
if($request_method !~^(GET|POST|HEAD)$) {
return 403;
}
location / {
#IP访问限制
allow 192.168.0.3;
deny all;
root html;
index index.html index.htm;
}
}