nginx的安装和使用
安装nginx
- (可选) su回车,输入密码,取得管理员权限。(不操作此步骤,可以使用sudo执行命令)
- 更新apt
sudo apt update
- 安装nginx
sudo apt install nginx
nginx安装目录介绍
通过 whereis nginx
查找nginx安装目录,一般在/usr/local/nginx
html:nginx错误页面和欢迎页面
log:访问日志、错误日志、nginx主进程pid文件
sbin:可执行文件,启动停止命令等
conf:配置文件
*_temp:共五个,存放临时文件
nginx启停命令
- 进入到nginx/sbin目录
cd /usr/local/nginx/sbin
- 启动nginx
./nginx
- 强制关闭nginx
./nginx -s stop
- 待所有请求结束后关闭nginx
./nginx -s quit
- 重启nginx
./nginx -s reload
Nginx配置文件详解
- 核心模块:
- HTTP模块(代理、缓存、日志定义和第三方模块)
- EVENTS模块(网络连接)
- 全局模块(全局日志、日志路径、PID路径、用户信息等)
- 基础模块:
- HTTP全局模块
- HTTP FastCGI模块
- HTTP Gzip模块
- HTTP server模块(虚拟主机,一个http可以由多个server)
- HTTP location模块(请求的路由,各种页面的处理)
- HTTP Rewrite模块
- 第三方模块:
- HTTP Upstream Request Hash模块
- Notice模块
- HTTP Access Key模块
nginx代理模式
1)正向代理
2)反向代理
3)透明代理
nginx集群
流程图
负载均衡策略
- 轮询(默认)
upstream localhost { server 192.168.134.33:8081 weight = 1; server 192.168.134.34:8081 weight = 1; }
- **加权轮询 **
upstream localhost { server 192.168.134.33:8081 weight = 1; server 192.168.134.34:8081 weight = 3; }
- 源地址哈希法:根据客户端ip求hash取模,同一个ip的请求会转发到固定的服务器,解决session问题。
upstream localhost { ip_hash; server 192.168.134.33:8081; server 192.168.134.34:8081; }
- 最小连接数法
upstream localhost { least_conn; server 192.168.134.33:8081; server 192.168.134.34:8081; }
- fair:nginx默认不支持,需要安装upsteram_fair模块。可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream localhost { fair; server 192.168.134.33:8081; server 192.168.134.34:8081; }
- url_hash:nginx默认不支持,需要安装Nginx的hash软件包。按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器。
upstream localhost { hash $request_uri; server 192.168.134.33:8081; server 192.168.134.34:8081; }
日志管理
- nginx日志默认路径为
logs/access.log
- 默认格式为 main:
log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" ' \$status \$body_bytes_sent "\$http_referer" ' '"\$http_user_agent" "\$http_x_forwarded_for"';
- $remote_addr: 客户端的ip地址(代理服务器,显示代理服务ip)
- $remote_user: 用于记录远程客户端的用户名称(一般为“-”)
- $time_local: 用于记录访问时间和时区
- $request: 用于记录请求的url以及请求方法
- $status: 响应状态码,例如:200成功、404页面找不到等。
- $body_bytes_sent: 给客户端发送的文件主体内容字节数
- $http_user_agent: 用户所使用的代理(一般为浏览器)
- $http_x_forwarded_for: 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
- $http_referer: 可以记录用户是从哪个链接访问过来的
日志切割
-
创建一个切割脚本
vi /opt/nginx/nginx_log.sh
#!/bin/bash #设置日志文件存放目录 LOG_HOME="/opt/nginx/logs/" #备分文件名称 LOG_PATH_BAK="$(date -d yesterday +%Y%m%d%H%M)".access.log #重命名日志文件 mv ${LOG_HOME}/access.log ${LOG_HOME}/${LOG_PATH_BAK}.log #向nginx主进程发信号重新打开日志 kill -USR1 `cat /opt/nginx/logs/nginx.pid`
-
创建一个定时任务。
crontab -e
-
一分钟一次
*/1 * * * * sh /opt/nginx/nginx_log.sh
-
启动定时任务
service crond restart
动静分离
- 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
- 一种是动态跟静态文件混合在一起发布,通过nginx 来分开
- nginx.conf中的server模块增加如下配置:
或location = / { proxy_passhttp://tomcat:8080/index }
或location ^~ /static/ { root /webroot/res/; }
location ~* \.(gif|jpg|jpeg|png|css|js|ico)${ root /webroot/res/; }
高并发配置
-
如何提高系统并发能力?
- 垂直拓展:提高单机硬件性能或单机架构性能。
- 水平拓展: 增加集群机器数量
-
高并发下nginx配置限流
- limit_conn_zone (客户端限流)
http{ limit_conn_zone $binary_remote_addr zone=one:10m; server { ...... limit_conn one 10; ...... } }
- 其中“limit_conn one 10”既可以放在server层对整个server有效,也可以放在location中只对单独的location有效
- 该配置表明:客户端的并发连接数只能是10个
- limit_req_zone (客户端限流)
http{ limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s; server { ...... limit_req zone=req_one burst=120; ...... } }
- 其中“limit_req zone=req_one burst=120”既可以放在server层对整个server有效,也可以放在location中只对单独的location有效
- rate=1r/s的意思是每个地址每秒只能请求一次,也就是说令牌桶burst=120一共有120块令牌,并且每秒钟只新增1块令牌,120块令牌发完后,多出来的请求就会返回503
- ngx_http_upstream_module (后端限流,推荐)
upstream xxxx{ server 127.0.0.1:8080 max_conns=10; server 127.0.0.1:8081 max_conns=10; }
-
并发测试工具 ab
- 安装
ubuntu: apt-get install apache2-utils centos: yum install httpd-tools -y
- 使用
# 10个用户,1000个请求 ab -c 10 -n 1000 http://www.test.com/
-
高并发下的nginx安全配置
- 版本安全,隐藏nginx版本号
http { server_tokens off; }
- ip安全,白名单和黑名单设置
# 白名单配置 location / { allow 192.168.136.123; deny all; } # 黑名单设置 location / { deny 192.168.136.123; allow all; }
- 文件安全
访问路径为logs时,列表展示/opt/nginx/logs/下的所有log或txt结尾的文件
location /logs { autoindex on; root /opt/nginx/; } location ^/logs~*\.(log|txt)$ { add_header Content-Type text/plain; root /opt/nginx/; }
- 连接安全,开启https
-
Nginx配置进程数、并发数、系统优化
- 调整Nginx的主配置文件,增加并发量
worker_processes 1; #调整到与CPU数量一致 events { worker_connection 1024; #每个worker最大并发连接数,进程数*1024 }
- 调整内核参数
# 查看所有的属性值 ulimit -a # 临时设置硬限制 ulimit -Hn 100000 # 临时设置软限制 ulimit -Sn 100000 # 修改配置文件,永久设置软硬限制 vim /etc/security/limits.conf ... * soft nofile 100000 * hard nofile 100000 用户/组 软/硬限制 需要限制的项目 限制的值
- 长连接配置keepalive_timeout
- 高并发下nginx压缩
#gzip模块设置 #开启压缩 gzip on; # 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。 默认值是0,不管页面多大都压缩。建议设置成大于2k的字节数,小于2k可能会越压越大。 gzip_min_length 2k; # 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单 位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k 为单位的4倍申请内存。 # 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。 gzip_buffers 4 16k; #压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间 gzip_comp_level 5; # 默认值: gzip_types text/html (默认不对js/css文件进行压缩) # 压缩类型,匹配MIME类型进行压缩 # 不能用通配符 text/* # (无论是否指定)text/html默认已经压缩 # 设置哪压缩种文本文件可参考 conf/mime.types gzip_types text/plain application/xjavascript text/css application/xml; # 值为1.0和1.1 代表是否压缩http协议1.0,选择1.0则1.0和1.1都可以压缩 gzip_http_version 1.0 # IE6及以下禁止压缩 gzip_disable "MSIE [1-6]\."; # 默认值:off # Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服 务器必须要返回包含"Via"的 header头。 # off - 关闭所有的代理结果数据的压缩 # expired - 启用压缩,如果header头中包含 "Expires" 头信息 # no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息 # no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息 # private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息 # no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息 # no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息 # auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息 # any - 无条件启用压缩 gzip_proxied expired no-cache no-store private auth; # 给CDN和代理服务器使用,针对相同url,可以根据头信息返回压缩和非压缩副本 gzip_vary on;
- 高并发下nginx状态监控
- 插件安装:./configure --prefix=/opt/nginx/ --with-http_stub_status_module
- 设定Nginx状态访问地址
location /NginxStatus { stub_status on; access_log off; }
- 查看Nginx并发进程数:ps -ef|grep nginx | wc -l
- 查看Web服务器TCP连接状态:netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
- 高并发下Nginx整合方案