一、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 最小响应时间优先提供服务