1 Nginx简介

1.1 Nginx的三个主要应用场景

静态资源服务

  • 通过本地文件系统提供服务

反向代理服务

  • 缓存
  • 负载均衡

API服务

Nginx直接访问数据库

  • OpenResty

1.2 历史背景

互联网的数据量快速增长

低效的Apache

1.3 优点

高并发、高性能

可扩展性好,模快化

高可靠性

热部署

BSD许可证

1.4 组成

二进制可执行文件

Nginx.conf配置文件

access.log访问日志

error.log错误日志

1.5 版本发布

feature新功能

fugfix修复BUG

change重构

1.6 不同版本的Nginx版本

开源免费:nginx.org

商业版:nginx.com

阿里巴巴:Tengine

开源OpenResty.org api服务器、web防火墙

商业版OpenResty.com

2 安装nginx

2.1 编译安装

yum/apt

编译nginx:只有通过编译nginx才能集成第三方

1、下载nginx

2、介绍各目录

3、Configure

4、中间文件介绍

5、编译

6、安装

目录

auto/cc
CHANGES
CHANGES.ru 作者俄罗斯人
conf
configure 
contrib  vim配置,使用vim编辑配置时有语法高亮效果
src 源码

查看编译支持哪些参数

./configure --help | more

# 路径的相关配置
--prefix=PATH  推荐:只指定这个参数即可
--modules-path=PATH 动态模块
--lock-path=PATH nginx.log文件放在哪

# 确定使用哪些模块
--with-select_moudle     将默认不加入的模块置为加入
--without-select_module  将默认加入的模块置为不加入

# 指定特殊参数

编译

# 预先安装下面这些软件
apt-get install libpcre3-dev \
    libssl-dev perl make build-essential curl

# 配置,指定安装目录
sudo ./configure --prefix=/opt/nginx
# 不用事先创建/opt/nginx目录
# 执行完后会列出配置特性及目录
# 生成的蹭文件会放在objs这个文件夹下
# 重要的文件objs/ngx_modules.c  要编译进nginx的模块都会放在这

# 编译
sudo make
# 生成的目标文件放在了objs目录下
# 做版本升级的时候会用到objs这个目录下的目标文件
# 如果配置了动态模块,动态模块生成的so也会放在objs这个目录下
# 生成的所有的中间文件都会放在src目录下

# 安装,首次安装可以使用这个命令
sudo make install
# 安装完成后进入prefix指定的目录下查看

2.2 配置语法

语法规则

  1. 配置文件由指令与指令块构成
  2. 每条指令以分号(;)结尾,指令与参数之间以空格符号分隔
  3. 指令块以{}大括号将多条指令组织在一块
  4. include语句允许组合多个配置文件以提升可维护性
  5. 使用#符号添加少注释,提高可读笥
  6. 使用$符号使用变量
  7. 部分指令的参数支持正则表达式

配置参数:时间的单位

ms 毫秒
s 秒
m 分钟
h 小时
d 天
w 周
M 月
y 年

配置参数:空间的单位

空字符 bytes
k/K
m/M
g/G

http配置的指令块

  • http 所有指令都是由http模块解析执行
  • server 对应域名
  • location 对应URL
  • upstream 表示上游服务

2.3 nginx命令行

  • 格式:nginx -s reload

  • 帮助:-? -h

  • 使用指定的配置文件:-c

  • 指定配置指令:-g

  • 指定运行目录:-p

  • 测试配置文件是否有语法错误:-t -T

  • 打印nginx的版本信息、编译信息等:-v -V

  • 操作运行中的进程中的方法通过发送信息 kill 命令或 -s参数

  • 立刻停止服务:-s stop

  • 优雅的停止服务:-s quit

  • 重载配置文件:-s reload

  • 重新开始记录日志文件:-s reopen

重载配置文件,平滑重启

# 打开tcp_nopush开关
vi /opt/nginx/conf/nginx.conf
# 平滑重启
nginx -s reload

热部署,升级,就是更换nginx这个二进制文件

# 查看nginx进程,有master和worker
ps -ef | grep nginx
# 备份
cp nginx nginx.old
# 替换nginx
cp -r /opt/soft_packages/nginx-1.16.1/objs/nginx /opt/nginx/sbin/
# 发送信号,重启nginx用新的二进制nginx文件
kill -USR2 old_nginx_pid
# 此命令只会关闭work进制,master进程保留,可用于版本回退(执行nginx -s reload)
kill -WINCH old_nginx_pid

切割日志文件

mv access.log access.bak.log
../sbin/nginx -s reopen

# 写成脚本放到crontab中执行
rotate.sh

rotate.sh

USR1信号是重新打开日志文件,和执行/opt/nginx/sbin/nginx -s reopen效果一样

#!/bin/bash
HIS_LOGS_PATH=/data/backup/logs
CUR_LOGS_PATH=/opt/nginx/logs
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
mv ${CUR_LOGS_PATH}/access.log ${HIS_LOGS_PATH}/access_${YESTERDAY}.log
mv ${CUR_LOGS_PATH}/error.log ${HIS_LOGS_PATH}/error_${YESTERDAY}.log
kill -USR1 $(cat /opt/nginx/logs/nginx.pid)

3 简单应用

3.1 搭建静态资源Web服务器

配置alias

# root与alias
# url与路径映射
# root问题:会把url中的一些路径带到文件目录里来
# 此时的dlib路径为/opt/nginx/dlib
location / {
	alias dlib/
}

打开gzip

# 如下代码与server同级
gzip  on;
gzip_min_length 1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

3.2 访问目录结构

第三方模块:autoindex

location / {
	...
	autoindex on;
}

3.3 限制大文件访问速度

http://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate

location / {
	...
	set $limit_rate 1k;
}

3.4 记录日志access.log

http://nginx.org/en/docs/http/ngx_http_log_module.html

log_format 定义日志格式
变量
access_log 日志记录在哪