一、Nginx 简介与安装
1、Nginx 简介
Nginx 是一个高性能 WEB 服务器,除此之外还有 Apache、Tomcat、Jetty、IIS 等,Nginx 相对于其他服务器的优势有以下几点:
- Nginx 与语言无关
- Nginx 可以在 Windows、Mac 和 Linux 发行版上部署
- Nginx 事实上已经成为业界使用最多的 WEB 服务器,Apache 由于发展时间长,用户依然众多,但 Nginx 的增长速度更快
2、编译与安装
安装环境准备
- Liux 内核要求在 2.6 以上,Linux2.6 以上支持 epoll,在 2.6 之前使用的是 select 或 pool 多路复用 I / O 模型,无法解决高并发问题,可以使用
uname -a
查看 Linux 内核版本。 - gcc 编译器
- pcre 库,PCRE 是支持正则表达式的函数库,目前使用广泛。
- zlib 库,用于压缩和解压。
- OpenSSL 开发库,用于支持 https 协议
以上五个软件包可以使用如下命令在 CentOS 上安装:
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel
源码获取
nginx 下载
wget https://nginx.org/download/nginx-1.19.0.tar.gz
tar xf nginx-1.19.0.tar.gz
简单安装
./configure
make & make install
执行完成之后 nginx 就会被安装到 /usr/local/nginx
基于参数构建
./configure --prefix=/usr/local/nginx --with-http_sub_status_module --with-http_ssl_module --with-debug
控制命令
# 默认方式启动
./sbin/nginx
# 指定配置文件启动 nginx
./sbin/nginx -c nginx.conf
# 指定 nginx 程序目录启动
./sbin/nginx -p /usr/local/nginx
# 快速停止
./sbin/nginx -s stop
# 优雅停止
./sbin/nginx -s quit
# 热装载配置文件
./sbin/nginx -s reload
# 重新打开日志文件
./sbin/nginx -s reopen
# 测试配置文件是否有语法错误
./sbin/nginx -t nginx.conf
二、Nginx 特点
- nginx 启动时,会生成两种类型的进程,一个是 Master 进程,一个或者多个 Worker 进程。主进程并不处理网络请求,主要负责调度 worker 进程(包括加载配置、启动 Worker 进程和非停机升级);
- 服务器实际处理网络请求及响应的是 Worker 进程,在类 Unix 系统上,nginx 可以配置多个 Worker 进程,而每个 Worker 进程都可以同时处理数以千计的网络请求;
- 模块化设计,nginx 的 Worker 进程包含核心和功能性模块,核心模块负责维持一个 run-loop,执行网络请求处理的不同阶段的模块功能,如网络读写,存储读写、内容传递、过滤,以及将请求发往后端服务器等,而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特殊功能的服务;
- 事件驱动、异步非阻塞,可以说是 nginx 能支持高并发、高性能的关键因素,同时也得益于对 Linux 的 kqueue、epoll 和事件机制。
三、Nginx 配置与使用
1、配置文件语法与格式
例子
worker_processes 1;
events {worker_connections 1024;}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.zjwblog.cn;
location / {
root html;
index index.html index.htm;
}
location /nginx_status {
stub_status on;
access_log off;
}
}
}
events、http、server、location、upstream 为配置项块,而 worker_processes、worker_connections、include、listen 为配置项。nginx_status 属于配置块的特定参数,其中 server 块嵌套于 http 块,其可以直接继承访问 http 块当中的参数。
如果配置项值中包含语法符号,如空格符,那么就需要用单引号或者双引号包裹起来,例如
log_format main '$remote_addr - $remote_user [$time_local]"$request"''$status $body_bytes_sent "$http_referer" ''"$http_user_agent""$http_x_forwarded_for"';
2、用例
- 居于目录动静分离
server {
listen 80;
server_name www.zjwblog.cn *.zjwblog.cn;
root /usr/local/www/zjwblog;
location / {index index.html;}
location /static {alias /usr/local/www/static;}
}
- 基于正则表达式实现动静分离
server {
listen 80;
server_name www.zjwblog.cn *.zjwblog.cn;
root /usr/local/www/zjwblog;
location ~* \.(gif|jpg|jpeg|svg|css|js|png)$ {alias /usr/local/www/zjwblog/static;}
}
- 防盗链
valid_referers none blocked *.zjwblog.cn;
if ($invalid_referer) {return 403;}
- 下载限速
location /download {
# 限速多少
limit_rate 1m;
# 在多少之后限速
limit_rate_after 10m;
}
- IP 黑名单
echo 'deny 192.168.0.123;' >> black.ip
# 在配置文件中包含黑名单文件
include black.ip
3、日志配置
nginx 日志可以全局配置,也可以在各个 server 配置块中配置
server {
listen 80;
server_name www.zjwblog.cn *.zjwblog.cn;
root /usr/local/www/zjwblog/;
# error 日志级别有 debug info notice warn error crit alert emerg
error_log /logs/$host.error.log info;
access_log logs/$host.access.log main;
# ... 其他配置项
# ...
}
针对指定的客户端输出 debug 日志
events {
debug_connection 192.168.0.243;
debug_connection 10.25.123.0/8;
}
四、Nginx 反向代理
反向代理是指客户端访问目标服务器,在目标服务器内部有一个统一接入网关将请求转发至后端真正处理的服务器并返回结果。这个过程当中客户端并不知道代理服务器的存在。
正向代理与反向代理
正向代理 | 反向代理 | |
---|---|---|
代理服务器位置 | 客户端与服务器都能连接的位置 | 目标服务器内部 |
主要作用 | 屏蔽客户端 IP,集中式缓存,解决客户端不能直接连接服务器的问题 | 屏蔽服务器内部实现细节,实现负载均衡,服务端缓存等 |
应用场景 | 爬虫、访问内网资源等 | 解决高并发问题 |
Nginx 代理基本配置
- 正向代理
location = /zjwblog {proxy_pass http://www.zjwblog.cn;}
- 反向代理
location /blog/ {proxy_pass http://server;}
- 代理相关参数
proxy_pass # 代理服务器
proxy_redirect off; # 是否允许重定向
proxy_set_header Host $host; # 传 header 参数至后端服务
proxy_set_header X-Forwarded-For $remote_addr; 设置 request header,客户端 IP 地址
proxy_connect_timeout 90; 链接代理服务器超时时间
proxy_send_timeout 90; 请求发送最大超时时间
proxy_read_timeout 90; 读取最大超时时间
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
负载均衡配置和参数解析
通过 proxy_pass 可以把请求代理到后端服务器,但是为了实现更高的负载和性能,我们的后端服务器通常是一个集群,这个时候可以使用 upstream 模块实现负载均衡。
例子:
upstream myserver {
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:8081 weitht=8;
}
location / {proxy_pass http://myserver;}
相关参数解析
- server 配置被代理的服务器 ip 或者 ip:port
- weight 配置服务器的权重
- max_fails 失败多少次认为主机已经挂掉,被剔除
- backup 配置备用服务器
- max_conns 允许最大链接数
- slow_start 当节点恢复时,不立即加入,而是等待 slow_start 之后加入服务列表
upstream 负载均衡算法
- weight 轮训加权重(默认)
- ip_hash 基于 hash 计算,解决 session 一致性问题
- url_hash 静态资源缓存,节约存储,加快速度
- least_conn 最少链接优先提供服务
- least_time 最小响应时间优先提供服务