nginx
nginx是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务
- 主要功能反向代理
- 通过配置文件可以实现集群和负载均衡
- 静态资源虚拟化
正向代理:
- 客户端请求目标服务器之间的一个代理服务器
- 请求会先经过代理服务器,然后再转发请求到目标服务器,获得内容后最后响应给客户端
反向代理:
- 用户请求目标服务器,由代理服务器决定访问哪个IP
安装nginx
- 安装gcc环境
yum install gcc-c++
- 安装pcre库,用于解析正则表达式
yum install -y pcre pcre-devel
- zlib 压缩和解压缩依赖
yum install -y zlib zlib--devel
- SSL安全的加密的套接字协议层,用于HTTP安全传输,即HTTPS
yum install -y openssl openssl-devel
- 解压
tar -zxvf nginx
- 配置
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
- 编译
make
- 安装
make install
- 启动停止重新加载命令
./nginx
./nginx -s stop
./nginx -s reload
nginx.conf
配置结构:
- main 全局配置
- event 配置工作模式及连接数
- http http模块相关配置
- server 虚拟主机配置,可以有多个
- location 路由规则,表达式
- upstream 集群,内网服务器
- server 虚拟主机配置,可以有多个
核心配置:
- 设置worker进程的用户,指的是Linux中的用户,会涉及到nginx操作目录或文件的一些权限.默认为nobody
user nobody;
- worker进程工作数设置,一般来说CPU有几个就设置几个,或者设置为N-1
worker_processess 1;
- nginx日志级别
debug|info|notice|warn|error|crit|alert|emerg
错误级别从左到右越来越大 - 设置nginx进程pid
pid logs/nginx.pid;
- 设置工作模式
events {
# 默认使用epoll
use epoll;
# 每个worker允许连接的客户端最大连接数
worker_connections 10240;
}
- http是指令块,针对http网络传输的一些指令配置
http {
}
- include引入外部配置,提高可读性,避免单个文件过大
include mime.types;
- log_format:设定日志格式,main为定义的格式名称,如此access_log就可以直接使用这个变量了
sendfile
使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush
,是指当数据表积累到一定大小后才发送,提高了效率
sendfile on;
tcp_nopush on;
keepalive_timeout
设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗
# keepalive_timeout 0;
keepalive_timeout 65;
- gzip 压缩传输内容,使得传输更快,节约服务器带宽开销,提升客户端渲染速度;但是消耗服务器CPU性能
# 开启gzip压缩功能,目的:提高传输效率,节约带宽
gzip on;
# 限制最小压缩,小于1字节的文件不会压缩
gzip_min_length 1;
# 定义压缩级别(压缩比,文件越大压缩越多,但是cpu使用会越多)
gzip_comp_level 3;
# 定义压缩文件的类型
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-http-php image/gif image/png application/json;
- server 虚拟服务器/主机
- root路径完全匹配访问;处理结果是root路径+location路径
- alias为路径做一个别名,对用户透明;使用alias路径替换location路径
- alias使用时,目录名后面一定要加
/
;alias只能位于location中 - root可以不放在location中;配置段(http,server,location,if)
- alias是一个目录别名的定义,root则是最上层目录的定义
- location匹配规则
空格
:默认匹配,普通匹配
location / {
root /home;
}
* `=`:精确匹配
location = /img/test.png {
root /home;
}
* `~*`:匹配正则表达式,不区分大小写
location ~* \.(GIF|jpg|png|jpeg) {
root /home;
}
* `~`:匹配正则表达式,区分大小写
location ~ \.(GIF|jpg|png|jpeg) {
root /home;
}
* `^~`:以某个字符路径开头
location ^~ /img {
root /home;
}
- nginx跨域
# 允许跨域请求的域,*代表所有
add_header 'Access-Controller-Allow-Origin' *;
# 允许带上cookie请求
add_header 'Access-Controller-Allow-Credentials' 'true';
# 允许请求的方法
add_header 'Access-Controller-Allow-Methods' *;
# 允许请求的header
add_header 'Access-Controller-Allow-Headers' *;
- 防盗链
# 对源站点验证
valid_referers *.test.com;
# 非法引入会进入下方判断
if ( $invalid_referer ) {
return 404;
}
nginx常用命令
- ` ./nginx -s stop
暴力关闭,推荐使用
./nginx -s quit
`关闭nginx - ` ./nginx -t`检测配置文件是否正确
- ` ./nginx -c nginx.conf`指定配置文件启动
nginx日志切割
- 创建可执行文件
#!/bin/bash
LOG_PATH="/var/log/nginx"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
# 向nginx主进程发送信号,用于重新打开日志文件
kill -USR1 `cat $PID`
- 添加可执行的权限
chmod +x cut_nginx_log.sh
- 安装定时任务
yum install crontabs
crontab -e
编辑并添加一行新的任务
*/1 * * * * /usr/local/nginx/sbin/cut_nginx_log.sh
- 重启定时任务
service crond restart
* 附:常用定时任务命令
service crond start // 启动服务
service crond stop // 关闭服务
service crond restart // 重启服务
service crond reload // 重新载入配置
crontab -e // 编辑任务
crontab -l // 查看任务列表
nginx模块化体系
- nginx core
- http
- event module
- phase handler
- output filter
- upstream
- load balancer
- extend module
- http
nginx负载均衡配置、常用策略、场景及特点
- 轮询(默认)
- 优点:实现简单
- 缺点:不考虑每台服务器处理能力
- 示例
# 配置上游服务器
upstream backserver{
# nginx默认轮询
server 127.0.0.1:8080;
server 127.0.0.1:6060;
server 127.0.0.1:7070;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
}
}
- 权重
- 优点:考虑了每台服务器处理能力的不同
- 示例
# 配置上游服务器
upstream backserver{
# weight参数默认为1
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:6060 weight=2;
server 127.0.0.1:7070 weight=5;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
}
}
- ip hash
- 优点:能实现同一个用户访问同一个服务器(用户IP没有更改)
- 缺点:根据ip hash不一定平均
- 备注:不能把后台服务器直接移除,只能标记down
- 补充:一致性哈希算法
- 示例
# 配置上游服务器
upstream backserver{
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:6060;
server 127.0.0.1:7070;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
}
}
- url hash(第三方)
- 优点:能实现同一个服务访问同一个服务器
- 缺点:根据url hash分配请求会不平均,请求频繁的url会请求到同一个服务器上
- 示例
# 配置上游服务器
upstream backserver{
# $request_uri是nginx内置变量,uri
hash $request_uri;
server 127.0.0.1:8080;
server 127.0.0.1:6060;
server 127.0.0.1:7070;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
}
}
- least_conn(请求连接最少的服务)
- 示例
# 配置上游服务器
upstream backserver{
# least_conn请求连接最少的服务
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:6060;
server 127.0.0.1:7070;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
}
}
- fair(第三方)
- 特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配
负载均衡配置参数
upstream指令参数
max_conns
限制每台service的连接数,用于保护避免过载,可起到限流作用,默认值为0,即不限制连接数- 示例
# 配置上游服务器
upstream backserver{
# max_conns默认为0,不限制连接数
server 127.0.0.1:8080 max_conns=2;
server 127.0.0.1:6060 max_conns=2;
server 127.0.0.1:7070 max_conns=2;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
}
}
slow_start
(商业版,需要付费)该参数不能使用在hash
和random load balancing
中。如果在upstream中只有一台server,则该参数失效- 示例
# 配置上游服务器
upstream backserver{
# slow_start默认为0,不开启
server 127.0.0.1:8080 weight=2 slow_start=60s;
server 127.0.0.1:6060 weight=2;
server 127.0.0.1:7070 weight=2;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
}
}
down
用于标记服务节点不可用- 示例
# 配置上游服务器
upstream backserver{
# down标识8080节点不可用
server 127.0.0.1:8080 down;
server 127.0.0.1:6060 weight=1;
server 127.0.0.1:7070 weight=1;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
}
}
backup
表示当前服务器是备用机,只有在其他的服务器宕机以后,自己才会加入到集群中(backup
参数不能使用在hash
和random load balancing
中)- 示例
# 配置上游服务器
upstream backserver{
# backup标识8080节点为备用机
server 127.0.0.1:8080 backup;
server 127.0.0.1:6060 weight=1;
server 127.0.0.1:7070 weight=1;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
}
}
max_fails
最大失败次数,满足条件则标记server已宕机,剔出上游服务(默认值为1)fail_timeout
表示失败重试时间(默认值10秒)- 示例
# 配置上游服务器
upstream backserver{
# 在10秒内请求8080失败达到2次,则认为8080已经挂了,
# 随后再过10秒,这10秒内不会由新的请求到达8080节点上,
# 10秒后会再有新请求尝试连接挂掉的8080,如果还是失败,
# 重复上一个过程,知道回复
server 127.0.0.1:8080 max_fails=2 fail_timeout=10s;
server 127.0.0.1:6060 weight=1;
server 127.0.0.1:7070 weight=1;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
}
}
keepalived
设置长连接处理的数量,提高吞吐量
(proxy_http_version
设置长连接http版本为1.1;proxy_set_header
清除connection header信息)- 示例
# 配置上游服务器
upstream backserver{
server 127.0.0.1:8080 max_fails=2 fail_timeout=10s;
server 127.0.0.1:6060 weight=1;
server 127.0.0.1:7070 weight=1;
# 设置长连接处理的数量
keepalive 32;
}
server {
listen 80;
server_name www.backserver.com;
location / {
proxy_pass http://backserver;
# 设置长连接http版本为1.1
proxy_http_version 1.1;
# 清楚connection header信息
proxy_set_header Connection "";
}
}
nginx缓存
- 浏览器缓存
- 加速用户访问,提升单个用户体验,缓存在本地
- nginx缓存
- 缓存在nginx端,提升所有访问到nginx端的用户
- 提升访问上游(upstream)服务器的速度
# proxy_cache_path 设置缓存目录
# keys_zone 设置共享内存以及占用空间大小
# max_size 设置缓存大小
# inactive 超过此时间则被清理
# use_temp_path 临时目录,使用后会影响nginx性能(关闭临时目录)
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=1m use_temp_path=off;
server {
# 启用缓存和keys_zone一致
proxy_cache mycache;
# 针对200和304状态码缓存时间为8小时
proxy_cache_valid 200 304 8h;
location / {
proxy_pass http://home;
}
}
* 用户访问仍然会产生请求流量
* 控制浏览器缓存:
# expires [time] expires @[time]
location /files {
alias /home;
# expires过期时间
# 10秒间隔
# expires 10s;
# 晚上10点半过期
# expires @22h30m;
# 1小时钱缓存失效
# expires -1h;
# no cache
# expires epoch;
# 默认值(浏览器默认缓存时间)
# expires off;
# 永不过期
expires max;
}
使用nginx配置HTTPS域名证书
- 安装SSL模块(
--with-http_ssl_mould
) - 配置HTTPS
- 把ssl证书
*.crt
和私钥*.key
拷贝到nginx配置目录下 - 新增server监听443端口
- 把ssl证书
upstream backserver {
server 127.0.0.1:8080;
}
server {
listen 443;
server_name www.backserver.com;
# 开启ssl
ssl on;
# 配置ssl证书
ssl_certificate [证书路径];
# 配置s证书密钥
ssl_certificate_key [证书密钥路径];
# ssl会话cache
ssl_session_cache shared:SSL:1m;
# ssl会话超时时间
ssl_session_timeout 5m;
# 配置加密套件,写法遵循openssl标准
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://backserver;
}
}