Nginx 服务器是一款高性能的服务器, 之前部署网站就使用了它进行反向代理, 这次就好好总结 Nginx 相关的特性与使用.
01 前言
Nginx 服务器是 web 服务器, 也就是我们平时用来提供 Web 服务的. 我们之前可能听过 Apache,Tomcat,IIS 等的服务器, 其实 Nginx 和它们都是一样的, 都可以通过 HTTP 为浏览器等客户端提供各种服务.
Nginx 服务器是一个跨平台的服务器, 可以运行在 Windows 和 Linux 以及 Mac OS 等操作系统, 它的特点就是可以处理大规模的并发连接. 接下来就具体介绍一下.
02 正向代理与反向代理
代理客户端
代理服务端
比如我们访问 google.com 的时候, 是通过正向代理的方式, 谷歌服务器是不知道是哪个用户对它进行访问 , 这就是正向代理; 但是假如谷歌服务器压力大, 承受不了这么多人访问, 用户的请求就会分发到不同的谷歌服务器, 用户不知道自己请求的具体是哪一台服务器 , 这就是反向代理.
正向代理
反向代理
03 Nginx
Nginx 特点
响应快
扩展性强
可靠性高
内存消耗少
支持高并发
热部署
免费开源
Nginx 的使用
我们要为了能够方便地使用 Nginx, 一般我们都会将它安装在 Linux 系统上面. 所以我们现在服务器上面安装 Nginx, 只需一行代码就搞定. 默认情况之下, nginx 会安装在 /etc/nginx 目录之下, 其中 nginx.conf 是它的配置文件.
yum install nginx
我们有必要了解一下 nginx 相关的命令, 我们经常会使用, 比如启动停止, 查看状态等.
启动
systemctl start nginx
停止
systemctl stop nginx
重启
systemctl restart nginx systemctl status nginx
状态
systemctl status nginx nginx -v
版本
nginx -v
测试
nginx -t
Nginx 进程
Nginx 服务器一般都是使用一个 master 主进程管理多个 worker 进程的, 而 worker 进程一般与服务器 CPU 的核数相等.
master 进程是不提供服务的, 真正提供服务的是 worker 进程, worker 进程之间通过进程间通信机制实现通信, 如负载均衡等. 假如 worker 某进程出错, 其余进程将不受影响继续提供服务, master 进程也会启动一个新的进程.
nginx.conf
nginx 的默认配置文件一共有以下几块, 分别配置不同的信息.
- user nginx; #配置用户或者组, 默认为 nginx.
- worker_processes 2; #允许生成的进程数, 默认为 1
- pid /nginx/pid/nginx.pid; #指定 nginx 进程运行文件存放地址
- error_log log/error.log debug; #制定日志路径, 级别. 级别可为: 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 80; #监听端口
- 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
- }
- }
- }
全局块
events 块
http 块
server 块
location 块
反向代理
反向代理用于接收网络上的请求, 然后将请求转发到目标服务器, 然后目标服务器返回给代理服务器, 最后返回给用户. 此方法延长了请求时间, 但是降低了目标服务器的压力.
反向代理的基本配置:
proxy_pass : 将请求代理到当前的服务器, 可以是主机名 / IP 地址 + 端口形式
proxy_methods : 表示转发时的协议方法名, 如 get/post 等
proxy_hide_header : 指定目标服务器返回给代理服务器的响应中, 代理决定哪些头不转发给客户端, 值为响应头
proxy_pass_header : 与上面相反, 表示哪些头允许转发给客户端
proxy_pass_request_body : 是否向目标服务器发送 HTTP 包实体部分, 值为 on/off
proxy_pass_request_headers : 是否向目标服务器发送 HTTP 头, 值为 on/off
proxy_redirect : 如目标服务器返回 301/302 重定向, 那么就会重设 location 或者 refresh 字段
- proxy_redirect http://localhost:8000/two/
- http://frontend;
如果请求 http://localhost:8000/two/uri/ 在返回重定向的情况下, 实际上转发给客户端的就是 http://frontend/uri , 值为 off 则将使 location 或者 refresh 字段维持不变
proxy_next_upstream : 表示目标服务器转发请求发生错误, 换一台目标服务器处理这个请求
负载均衡
实现负载均衡最关键的模块就是 upstream 模块, 服务器就写在里面的 server 字段, 对应着不同的服务器.
- http {
- upstream test {
- server xx.xxx.xxx.xx weight:5;
- server xx.xx.xx.xx max_fails=3 fail_timeout=30s;
- }
- server {
- listen 8080;
- location / {
- proxy_pass http://test;
- }
- }
- }
这里的意思就是当你请求根路径的时候就会代理到 upstream 里面的两个服务器, 以此来实现负载均衡的功能.
server 配置选项:
- weight
- max_fails
- dowm
- backup
upstream 配置选项:
ip_hash : 解决同一用户在不同的服务器中缓存相同的信息, 与 weight 不可同时使用
- http {
- upstream test {
- ip_hash;
- server xx1.xxx.xxx.xx;
- server xx2.xx.xx.xx;
- server xx3.xx.xx.xx;
- }
- server {
- listen 8080;
- location / {
- proxy_pass http://test;
- }
- }
- }
04 小结
通过对 Nginx 服务器的一些理解, 会让我们知道一些网络上的知识, 如正向代理与反向代理的区别, 负载均衡的实现等.
大家也可以尝试着使用 nginx 服务器进行一些配置, 上面只是一些简单的配置模块, 如果想要详情的理解去官网看一下. 对于前端来说, 懂基本的就可以, 不用像运维那样精通所有的配置, 当然学有余力最好不过了, 奈何自己学习能力有限, 以后再详解其中的一二.
来源: http://www.tuicool.com/articles/IB7Rbe3