Nginx 的三个主要应用场景:javascript
Nginx 背景和优势:php
互联网的数据量快速增加、摩尔定律的性能提高以及低效的 Apache(一个链接对应一个进程)促使 Nginx 的出现。css
Nginx 的优势html
Nginx 的组成java
Nginx 的版本发布nginx
开源版本的 Nginx 中,奇数版本的 Nginx 如1.15.x 是 Mainline 主干版本,它会有新的功能,但可能并不稳定,偶数版本如1.14.x,是Stable 稳定版本。每一个版本的 CHANGES 中,包含三部分:Feature新增功能、Bugfix 修复 bug、Change重构。c++
安装 Nginx 的方法主要用两种:编译 Nginx 或者直接安装二进制 nginx。二进制格式的 Nginx 中模块已经编译,但并非每个模块(功能)都开启(被编译),一些第三方模块,一样包含强大的功能就没法编译到二进制 Nginx 中。自主编译 nginx 能够根据本身的需求合理开启须要编译的模块。web
下载 Nginx正则表达式
下载你须要的 Nginx 版本,并解压缩。解压缩 Nginx 的源码包后,包含6个目录和5个文件vim
cp -r contrib/vim/* ~/.vim/
Configure
获取支持的的参数使用./configure --help
,编译时支持的参数有三类:
执行./configure --prefix=/usr/local/nginx
检查系统环境是否符合知足安装要求,并将定义好的安装配置信息和系统环境信息写入Makefile文件中。 Makefile 文件包含了如何编译、启用哪些功能、安装路径等信息。
在预编译过程当中,能够出现的错误大部分是由于软件包的缺失。编译 Nginx 须要依赖的软件包关系有:
yum install -y gcc gcc-c++ autoconf automake make / yum install -y pcre pcre-devel / yum install -y zlib zlib-devel
预编译后,会生成 objs 目录和 Makefile 文件
执行make命令进行编译。make命令会根据Makefile文件进行编译。编译工做主要是调用编译器(如gcc)将源码编译为可执行文件,一般须要一些函数库才能产生一个完整的可执行文件。
编译生成的二进制文件存在于 src 目录中,若是使用了动态模块,编译产生的.so 文件,会存在于 objs 目录中。
上面之因此没有使用 make && make install,是由于若是是升级 nginx,则须要将二进制文件拷贝到安装目录中。首次安装 nginx时,可使用make install将编译的文件复制到指定目录中。
建立软连接:sudo ln -s /usr/nginx-1.14.2/sbin/nginx /usr/bin/nginx
Nginx 的配置文件中,nginx.conf 为主配置文件,配置文件中,以#开始的行,或者是前面有若干空格或者 TAB 键,而后再跟#的行,都会被认为是注释。
Nginx 的配置文件是以 block(块)形式组织,每一个 block 都是以一个块名称和一对大括号“{}”组成。block 分为几个层级,整个配置文件为 main 级别,即最大层级;在 main 级别之下会有 event、http、mail 等层级,而 http 中又会包含 server block,server block 中能够包含 location block。即块之间是能够嵌套的,内层 block 继承外层 block。最基本的配置项语法格式是“配置项名 配置项值1 配置项值2 配置项值3 ... ”;
每一个层级能够有本身的指令(Directive),例如 worker_processes 是一个main层级指令,它指定 Nginx 服务的 Worker 进程数量。有的指令只能在一个层级中配置,如worker_processes 只能存在于 main 中,而有的指令能够存在于多个层级,在这种状况下,子 block 会继承 父 block 的配置,同时若是子block配置了与父block不一样的指令,则会覆盖掉父 block 的配置。指令的格式是“指令名 参数1 参数2 … 参数N;”,注意参数间可用任意数量空格分隔,最后要加分号。
下图是 Nginx 配置文件的通常结构:
总结一下 Nginx 的配置语法:
Nginx 中时间参数的单位
时间单位 | 描述 |
---|---|
ms | milliseconds |
s | seconds |
m | minutes |
h | hours |
d | days |
w | weeks |
M | months(30 days) |
y | years(365 days) |
Nginx 中空间参数的单位
空间单位 | 描述 |
---|---|
不加任何单位 | bytes |
k/K | Kilobytes |
m/M | Meagbytes |
g/G | Gigabytes |
Nginx 服务运行时,须要加载几个核心模块和一个事件模块,这些模块运行时所支持的配置项称为基本配置;基本配置项大概分为四类:
功能 | 命令行 |
---|---|
通常格式 | nginx -s reload |
获取帮助 | -?-h |
使用指定的配置文件 | -c |
指定配置指令 | -g |
执行运行的目录 | -p |
发送信号 | -s 马上中止服务 stop 优雅中止服务 quit 重载配置文件 reload 从新开始记录日志文件 reopen |
测试配置文件语法 | -t -T |
打印 nginx 的版本和编译信息 | -v -v |
这里须要说明的是:在修改配置文件后,使用nginx -s reload
,在不中止服务的状况下,运行修改后的配置文件。
cp ngnx nginx.old
kill -WINCH [旧 ngix mater 进程号]
。当前旧 nginx master还存在的缘由是,若是新版本 nginx有问题,能够进行版本回退。nginx -s reopen
,nginx 会从新生成同名的日志文件实际上日志切割会按期进行,应该使用 bash 脚原本实现,并有 crond 定时执行。
#!/bin/bash #Rotate the Nginx logs to prevent a single logfile from consuming too much disk space. LOGS_PATH=/usr/local/nginx/logs/history CUR_LOGS_PATH=/usr/local/nginx/logs YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) mv ${CUR_LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log mv ${CUR_LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log #向 Nginx 主进程发送 USR1 信号。USR1 信号试从新打开日志文件 kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
将静态网站部署在服务器中对外提供服务,在 nginx 安装目录中建立一个 dlib 目录用于存放静态网页
配置 nginx,修改配置文件中的 server 中的监听端口listen为80或8080,location 后面定义的"/"表示全部请求,指定 url的后缀与服务端文件系统路径一一对应,有两种用法,一种是使用 root,一种是使用 alias,如使用 alias dlib/就表示 url/后面的路径与 dlib/后面的路径是一一对应的。
节选配置文件:
user simon; ... http{ gzip on; ... server{ listen 8080; ... location / { alias dlib/; } } }
优化:开启压缩
gzip on; #开启 gzip 压缩 gzip_min_length 1; #压缩的最小单位,小于1字节不压缩 gzip_comp_level 2; #压缩级别 gzip_types text/plain application/x-javascript text/css application/xml text/javascript applicat ion/x-httpd-php image/jpep image/gif image/png; #针对指定类型进行压缩
压缩前:
压缩后:
功能:将文件系统经过web 网页展现
经过 ngx_http_autoindex_module ,能够将以“/”结尾的 url 对应到相应文件系统目录中,并列出。在 location 块中加入“autoindex on;”便可开启。
这里注意的是,当打开的是首页依然是一个web 页面,只有 url 中继续定义了查看静态网站文件系统目录中的某一目录时,才会将文件列出。
优化:高并发时,限制大文件的传输速率
在 location 块中,设置“set $limit_rate 1k(http 模块的内置变量);”意思是限制 nginx 每秒传输1字节到浏览器中,
定义 nginx access 日志格式
定义日志格式须要命名,由于会根据不一样的场景记录不一样的日志信息,nginx 默认的日志记录名称为 main,记录了诸如客户端 IP、客户端名称、时间、状态码等。
定义日志,在 http 配置块下,使用 log_format,后面定义日志的名称,而后使用nginx 中指定的变量定义须要记录的日志格式。
定义日志存储位置,使用 access_log,定义 access_log的位置决定了记录日志的范围,也就是说,当在 server 配置块中定义了 access_log,那么发往server 指定的端口或者域名的请求,都会使用 access_log定义的级别和位置进行记录。
使用 goaccess 可使日志可视化。
预编译参数
mkdir -p /var/cache/nginx ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/run/nginx.lock \ --http-client-body-temp-path=/var/cache/nginx/client_temp \ --http-proxy-temp-path=/var/cache/nginx/proxy_temp \ --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \ --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \ --http-scgi-temp-path=/var/cache/nginx/scgi_temp \ --user=nobody \ --group=nobody \ --with-pcre \ --with-http_v2_module \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-http_auth_request_module \ --with-mail \ --with-mail_ssl_module \ --with-file-aio \ --with-ipv6 \ --with-http_v2_module \ --with-threads \ --with-stream \ --with-stream_ssl_module
NGINX systemd service file
system 的有系统和用户的区分:系统(/lib/systemd/system/)、用户(/etc/lib/systemd/system/),通常系统管理员手工建立的单元文件建议存放在/etc/lib/systemd/system/目录下。
在/lib/systemd/system/目录下建立服务文件nginx.service
[Unit] Description=The NGINX HTTP and reverse proxy server #服务的简单描述 Documentation=http://nginx.org/en/docs/ #服务文档,无关紧要 After=syslog.target network.target remote-fs.target nss-lookup.target #定义启动顺序,After表示本服务在指定的服务以后启动,另外相似的还有 Before、Requires本单元启动,它须要的单元也会被启动;它须要的单元中止了,这个单元也中止了、wants推荐使用,这个单元启动了,它须要的单元也会被启动;它须要的单元被中止了,对本单元无影响。 [Service] Type=forking #systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你肯定此启动方式没法知足需求,使用此类型启动便可。使用此启动类型应同时指定 PIDFile=,以便systemd可以跟踪服务的主进程。 PIDFile=/usr/nginx-1.14.2/logs/nginx.pid ExecStartPre=/usr/bin/nginx -t ExecStart=/usr/bin/nginx ExecReload=/usr/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target