Nginx快速入门
1.Nginx 初识
Nginx 是一个高性能的 Http 和反向代理服务器,也是一个 IMUP、POP3、SMTP 之类的邮件代理服务器
(一)正向代理与反向代理
正向代理:客户端通过 client 设置,使用代理服务器 proxy 去访问远程服务器 server。
client - proxy - server
使用场景:
- 可以访问原来无法访问的资源
- 做缓存使用,加快访问速度
- 对客户端授权或者记录访问信息等
反向代理:服务器通过代理服务接受连接请求,然后再转发给内部网络的服务器,将服务器的结果返回值客户端
使用场景:
- 保证内网的安全,阻止 web 攻击
- 负载均衡,优化网站的处理能力
(二)Hello Nginx
程序启动后进程 id 存放于 nginx.pid,可以用命令 cat nginx.pid来查看
关闭方式: ./nginx -s stop
杀死进程:kill -9/TERM/QUIT 进程号 (分别代表强制、快速、平缓)
信号处理命令:./nginx -s +(stop 、quit、reopen、reload)
2.Nginx配置
分为三部分 全局块、events块、http块
(一)全局块
全局指令、指定运行时的用户组、进程id存放位置、日志存放位置、worker process数量
# 配置用户或者用户组
#user nobody;
# 支持的并发数量
worker_processes 1;
# 配置日志路径 debug | info | notice | warn |error | crit |alert |emerg
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
(二)events块
影响 nginx 服务器和用户网络连接的配置,比如每个进程的最大连接数,选取哪种时间驱动模型,以及在网络连接过程是否开启多个、序列化
# 每个进程的最大连接数
events {
worker_connections 1024;
}
(三)HTTP块
配置代理、缓存、日志等绝大部分功能的地方,可以嵌套多个 sever 块,不通的 快对应不同的域名(虚拟主机)
1)虚拟主机
同一台 nginx 服务器可以支持多个网站的运行,每个虚拟主机之间都相互独立,具有完整功能
http{
#对应虚拟主机配置
server{
#端口
listen 80;
#域名
server_name localhost;
#文件
location /{
# 相对路径
root html;
}
}
}
2)日志配置
通过日志可以获取用户的地址信息、跳转来源、终端、以及 url 访问量
#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 logs/access.log main;
名字 | 用途 |
---|---|
Remote_addr | 客户端的ip地址 |
remote_user | 客户端的用户名称 |
Time_local | 访问的时间和时区 |
Request | 请求方法 |
status | 相应状态码 |
body_bytes-sent | 主题内容字节数 |
http_referer | 记录访问来源 |
http_user_agent | 用户使用的代理 |
http_x_forwarded_for | 通过代理服务器记录客户端ip |
可以通过脚本实现日志切割
3)反向代理
jdk 路径:/usr/local/java。 tomcat 路径:/usr/local/tomcat
**需求:**要实现一台服务器多个 tomcat 的设置转发,需要拷贝一个 tomcat 安装目录,修改 server.xml 的三个端口
# ~后为url后置内容
location ~/tomcat1/ {
#表示代理转发的地址
proxy_pass http://www.baidu.com
}
4)负载均衡
早期使用 DNS (域名解析系统做负载),具体而言,给客户端解析不同的 ip 让流量直接到达服务器。
形如: 客户端 (n) – 负载均衡器 --调度算法-- 服务端(n)
优点:
- 用过健康检查,可以避免单点故障
- 当发现节点故障时,从集群中移除,保证应用的高可用
四层的负载均衡,在 OSI 模型的传输层,主要是转发
七层的负载均衡,在 OSI 模型的应用层,主要是代理
负载均衡可以处理 HTTP、HTTPS、TCP、UDP
负载均衡的调度算法:
1)轮询:相当于循环遍历服务器
2)最小连接:每次优先选择服务器连接最少的服务器,适用于会话时间较长的业务处理
3)ip 映射:根据请求的 ip 地址进行散列,让同一 ip 下的请求,都映射到同一服务器上,可以解决 session 问题(粘性会话)
# 轮询
# 此块 位于 http
upstream myserver {
server 192.168.1.20:8080 weight 1; # 权重 默认值是 1
server 192.168.1.20:8080;
}
# 此块位于 http -> server 块
server{
location /{
# 将请求映射到负载均衡器中
proxy_pass http://myserver;
}
}
如果需要根据 IP 地址 固定 server 处理,可以使用 ip_hash
upstream myserver {
server 192.168.1.20:8080 weight 1; # 权重 默认值是 1
server 192.168.1.20:8080;
ip_hash;
}
5)动静分离
将动态请求和静态请求区分,不能简单地认为动态页面和静态页面的物理分离
如果是静态资源请求,直接查找 nginx 上的静态资源地址
如果是静态资源地址,通过反向代理,映射到 tomcat 路径下的资源
实现方式:
- 单独把静态文件放在独立的服务器及独立域名下(推荐)
- 动态和静态资源混合,通过 nginx 分开
# 动态资源的请求转发
location ~.*.jsp$ {
# 负载均衡
proxy_pass http://myserver
}
# 静态
location ~.*\.(gif|jpg|...)$ {
root /usr/local/nginx/images;
expires 3d; # 在浏览器端使用缓存 设置过期时间
}
6)location 块
匹配规则:
- location = /uri 精确匹配
- location ^~/uri 前缀匹配,顺序在正则之前
- location~pattern 区分大小写的正则。 location~*pattern 不区分大小写的正则
- location /uri 前缀匹配 在正则以后
- location / 通用匹配。接受未匹配到的其他 location 请求
前缀匹配是按照指令长度,从长到短的顺序进行匹配
正则匹配是按照配置文件的顺序进行匹配
注意:前缀匹配的俩种形式不能同时出现
7)URL重写
对 URL 的规范化处理,域名更换时的新旧跳转,一些额外的参数调整