nginx配置及优化
nginx代理模式 分布式 配置优化 这篇挺好
nginx 安装
下载
去官网下载对应的nginx包,推荐安装稳定版本。
也可以使用我提供的百度云下载地址,版本号:1.19.5
链接:https://pan.baidu.com/s/19-ETJsKvxH5Z4jZ1iWUw6Q
提取码:fzla
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V5的分享
安装相关依赖
安装gcc环境
1 | yum -y install gcc-c++ |
安装RCPE库,用于解析正则表达式
1 | yum -y install pcre pcre-devel |
Zlib压缩和解压缩依赖
1 | yum install -y zlib zlib-devel |
SSL安全的加密的套接字协议层,用于HTTP安全传输,也就是https
1 | yum install -y openssl openssl-devel |
安装
上传
我在Linux下创建了/soft/nginx目录,并将安装包上传到此处
新建目录
1 | mkdir -p /soft/nginx |
上传安装包略..
解压并进入解压后的目录
1 | tar -zxvf nginx-1.16.1.tar.gz |
编译之前,需要先创建nginx临时目录,如果不创建,启动的时候会报错
1 | mkdir -p /var/temp/nginx |
在nginx目录,如果如下命令,目的是为了创建makefile文件,通过makefile才能进行编译和安装。
1 | ./configure \ |
注:\代表在命令行中换行,用于提高可读性
命令 | 解释 |
---|---|
–prefix | 指定nginx安装目录 |
-pid-path | 指定nginx的pid |
–lock-path | 锁定安装文件,防止被恶意篡改或者误操作 |
–error-log | 错误日志 |
–http-log-path | http日志 |
–with-http_gzip_static_module | 启用gzip模块,在线实时压缩输出数据流 |
–http-client-body-temp-path | 设定客户端请求的临时目录 |
–http-proxy-temp-path | 设定http代理临时目录 |
–http-fastcgi-temp-path | 设定fastcgi临时目录 |
–http-uwsgi-temp-path | 设定uwsgi临时目录 |
–http-scgi-temp-path | 设定scgi临时目录 |
make编译
1 | make |
安装
1 | make install |
检查nginx是否安装成功
1 | whereis nginx |
如果输出nginx: /usr/local/nginx 表示安装成功
进入sbin目录启动nginx
1 | cd /usr/local/nginx/sbin |
如果感觉每次进入目录比较深,可以在根目录创建快链
1 | ln -s /usr/local/nginx/sbin/nginx /nginx |
停止 ./nginx -s stop
重新加载 ./nginx -s reload
访问
打开浏览器,访问虚拟机所在内网ip即可打开Nginx默认页面,显示如下信息表示安装成功
注意事项: 如果是云服务器,安全组策略里开启默认80端口,如果在虚拟机内,请关闭防火墙~
nginx配置文件介绍
整体结构
设置worker进程的用户
设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody
1 | user root; |
设置worker进程工作数设置
worker进程工作数设置,官方建议CPU内核有几个,就设置几个,或者设置为N-1也行,默认为1
1 | worker_processes 1; |
日志级别
全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]错误级别从左到右越来越大
1 | error_log logs/error.log; |
设置nginx进程 pid
1 | pid logs/nginx.pid; |
设置events工作模式
1 | events { |
如何配置worker_connections的大小
系统的最大打开文件数>= worker_connections*worker_process
根据系统的最大打开文件数来调整,worker_connections进程连接数量要小于等于系统的最大打开文件数,worker_connections进程连接数量真实数量= worker_connections*worker_process
执行下面语句查看当前系统最大文件打开数
1 | ulimit -a|grep "open files" |
设置http 是指令块
http 是指令块,针对http网络传输的一些指令配置
1 | http { |
引入外部配置
include 引入外部配置,提高可读性,避免单个配置文件过大
1 | include mime.types; |
设置日志格式
设定日志格式,main为定义的格式名称,如此 access_log 就可以直接使用这个变量了
参数名 | 参数意义 |
---|---|
$remote_addr | 客户端ip |
$remote_user | 远程客户端用户名,一般为:’-’ |
$time_local | 时间和时区 |
$request | 请求的url以及method |
$status | 响应状态码 |
$body_bytes_send | 响应客户端内容字节数 |
$http_referer | 记录用户从哪个链接跳转过来的 |
$http_user_agent | 用户所使用的代理,一般来时都是浏览器 |
$http_x_forwarded_for | 通过代理服务器来记录客户端的ip |
设置高效文件传输
sendfile|使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,设置nginx在一个数据包里发送所有头文件,而不是一个接一个的发送,提高了效率
1 | sendfile on; |
设置客户端与服务端请求的超时时间
keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。
HTTP1.1支持持久连接alive,降低每个连接的alive时间可在一定程度上提高可响应连接数量,所以一般可适当降低此值
1 | #keepalive_timeout 0; |
设置 gzip压缩
gzip启用压缩,html/js/css压缩后传输会更快
1 | # 开启gzip压缩功能,目的:提高船速效率,节约宽带 |
设置虚拟主机
server可以在http指令块中设置多个虚拟主机
1 | listen 监听端口 |
nginx 常用命令
停止
1 | ./nginx -s quit |
使用上面命令能够更优雅的关闭nginx,不会立刻关闭(除非没有客户端请求)而是等待和现有的客户端交互完毕后才关闭
1 | ./nginx -s stop |
立即关闭nginx,当前所有的连接请求都直接中断
检查配置文件编写是否正确
1 | ./nginx -t |
查看nginx版本
1 | ./nginx -v |
查看帮助
1 | ./nginx -? |
指定nginx的核心配置文件
1 | ./nginx -c 配置文件路径 |
重启
1 | ./nginx -s reload |
日志切割
手动切割
现有的日志都会存在 access.log 文件中,但是随着时间的推移,这个文件的内容会越来越多,体积会越来越大,不便于运维人员查看,所以我们可以通过把这个大的日志文件切割为多份不同的小文件作为日志,切割规则可以以天为单位,如果每天有几百G或者几个T的日志的话,则可以按需以每半天或者每小时对日志切割一下。
具体步骤如下:
创建一个shell可执行文件:cut_my_log.sh,内容为:
1
2
3
4
5
6
7
8
9#!/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`为cut_my_log.sh添加可执行的权限:
1
chmod +x cut_my_log.sh
测试日志切割后的结果:
1
./cut_my_log.sh
自动切割
安装定时任务:
1
yum install crontabs
执行crontab -e 编辑并且添加一行新的任务:
1
*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh
重启定时任务
1
service crond restart
发布静态资源root 和 alias 的区别
在 Location 或者其他 Nginx 配置中会经常看到 root
和 alias
,开始我以为这两者是能够混用的,但其实两者有着很大的区别。root
指令会将 location 中的部分附加到 root 定义的末尾形成一个完整的路径;而 alias
则不会包含 location 中定义的部分。 假设我的静态资源存放位置/home/baidu目录下,想要访问有两种方式。
方式1:使用root 路劲完全匹配访问
找到nginx的配置文件,在端口号为80的server中添加
1 | location /baidu { |
重启nginx,访问即可。比如访问http://localhost:80/baidu/a.jpg。会定位到/home/baidu/a.jpg文件
方式2:使用alias 可以为路径起一个别名,对用户透明。既安全,又容易阅读
1 | location /static { |
重启nginx,访问即可。比如访问http://localhost:80/static/a.jpg。会定位到/home/baidu/a.jpg文件
跨域问题
在server模块中配置如下内容
1 | #允许跨域请求的域,*代表所有 |
静态资源防盗链
在server模块中配置如下内容
1 | #对源站点验证,验证通过,匹配location路径,匹配失败返回404状态码,也可以是其他状态码 |
附1:nginx.pid打开失败、失效、重启时丢失nginx.pid文件解决方法
错误重现
在执行重启命令./nginx -s reload是报如下错误
1 | nginx: [error] open() “/var/run/nginx/nginx.pid” failed (2: No such file or directory) |
解决方式1
第一步:查看目录是否存在
首先打开/var/run/nginx/
目录,如果没有该目录就创建该目录
1 | mkdir -p /var/run/nginx |
第二步:重新启动nginx
1 | ./nginx -s reload |
可能会报错:
1 | nginx: [error] invalid PID number "" in "/var/run/nginx/nginx.pid" |
有产生了新的问题,原因可能是nginx程序没有关联到默认的配置文件,手动关联
1 | ./nginx -c /usr/local/nginx/conf/nginx.conf |
解决方式2
如果使用虚拟机,重启虚拟机后,再次重启nginx会报错: nginx: [error] open() “/var/run/nginx/nginx.pid” failed (2: No such file or directory)
- 进入 cd /usr/local/nginx/conf/ 目录,编辑配置文件nginx.conf ;
- 在配置文件中有个注释的地方: #pid logs/nginx.pid;
- 将注释放开,并修改为:pid /usr/local/nginx/logs/nginx.pid;
- 在 /usr/local/nginx 目录下创建 logs 目录:mkdir /usr/local/nginx/logs
- 再次启动nginx服务:cd /usr/local/nginx/sbin/ 问题解决
附2:完整的配置文件
1 | #定义nginx运行的用户和用户组 |