13. nginx常用模块
1. nginx模块分类:
核心模块:提供最基本最核心的服务
标准HTTP模块:提供标准HTTP功能
可选HTTP模块:扩展标准HTTP功能
邮件服务模块:支持nginx的邮件功能
第三方模块:由第三方或者个人编写的可编译到nginx中的模块
2. nginx的核心模块: 主要针对的是main块和event块
ngx_core_module 核心
ngx_errlog_module 错误日志
ngx_conf_module 配置解析
ngx_events_module 事件
ngx_event_core_module 事件核心
ngx_epoll_module epoll驱动模型
ngx_regex_module 正则
3. nginx的标准HTTP模块:默认情况下是被编译到nginx中的,除非在配置的时候添加--without-xxx声明不编译。
ngx_http_core
ngx_http_access_module 基于IP地址的访问控制
ngx_http_auth_basic_module 基于HTTP的身份认证
ngx_http_fastcgi_module 对FastCGI的支持
ngx_http_gzip_module 压缩请求响应,可以减少数据传输
ngx_http_log_module 自定义access日志
ngx_http_memcached_module 对memcached的支持
ngx_http_proxy_module 支持代理服务
ngx_http_rewrite_module 通过正则表达式重定向请求
ngx_http_upstream_module 主要用于负载均衡
4. nginx的可选模块
ngx_http_flv_module 支持将flash多媒体信息按照流文件传输
ngx_http_gungzip_module
ngx_http_gzip_static_module 预压缩
ngx_http_mp4_module mp4流文件传输
ngx_http_ssl_module 支持HTTPS/SSL
ngx_http_stub_status_module 支持返回nginx服务器的统计信息
5. 邮件服务模块
ngx_mail_smtp_module
ngx_mail_pop3_module
ngx_mail_core_module
ngx_mail_auth_http_module
ngx_mail_proxy_module
ngx_mail_ssl_module
15. nginx的主配置文件详解
worker_processes 1; worker进程的数量--一般与cpu核数一致
events {
worker_connections 1024; 单个worker进程支持的最大TCP连接数
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80; 虚拟主机的端口
server_name localhost; 虚拟主机的域名
location / {
root html; 站点根目录
index index.html index.htm; 首页文件
}
error_page 500 502 503 504 /50x.html; http状态码,使用50x.html回应客户端
location = /50x.html {
root html;
}
}
}
20. 企业场景中重启nginx以后,检查网站是否正常的策略。
通过一个脚本自动检查网站的响应码。
脚本还在写
21. nginx常用功能配置实战
1. 规范nginx配置文件
在nginx.conf的主配置文件中,删除server标签内容。
把server标签内容分别放到以网站名称命名的配置文件中。如:www.conf learning.conf
在nginx.conf中添加关键字include www.conf; 注意冒号
include website/learning.conf;
include website/www.conf;
2. 为网站启用别名
好处:当有多台网站的时候,用别名进行监控网站。常用语nginx负载均衡器后面的虚拟主机区别。
还有一个虚拟主机可以有多个域名。
server {
listen 80;
server_name learning.cmr.com.cn a.cmr.com.cn;
location / {
root html/learning;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ .*\.(php|php5)?$ {
root html/learning;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
3. 为虚拟主机开启状态信息功能
server {
listen 80;
server_name learning.cmr.com.cn a.cmr.com.cn;
location / {
root html/learning;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ .*\.(php|php5)?$ {
root html/learning;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location /status {
stub_status on;
access_log off;
}
}
注意:这个状态是监控的整个nginx服务器的,而不是单独的某个虚拟主机。
所以不需要为每个虚拟主机添加status,新建一个status.conf的配置文件,然后输入内容:
server {
listen 80;
server_name status.cmr.com.cn;
location /status {
stub_status on;
access_log off;
}
然后把配置文件的路径添加到nginx.conf主配置文件中。
通过浏览器访问一下a.cmr.com.cn/status,得到结果如下:
Active connections: 1 当前建立的TCP连接数,TCP状态为ESTABLISHED
server accepts handled requests
22 22 49
Reading: 0 Writing: 1 Waiting: 0
C:\Users\yangjianbo>netstat -ano | find "192.168.0.201:80"
TCP 192.168.0.106:49741 192.168.0.201:80 ESTABLISHED 4048
server :表示从nginx启动后共有多少TCP连接
accepts:表示从nginx启动后成功多少TCP连接
handled request:表示一共处理了多少请求requests
reading:nginx读取客户端的header信息数
writing:nginx返回给客户端的header信息数
waiting:nginx已经处理完正在等候下一次请求的驻留TCP连接数 wating=active -(reading+writing)
淘宝自行研发的tengine里面多了一项:requests_time,增加对每请求的响应时间的统计:在nginx status模块中增加了所有请求的总响应时间(request_time),单位为ms.
4. 为nginx增加错误日志
在主配置文件添加:error_log logs/error.log;
格式: error_log file level;
level:[debug|info|notie|warn|error|crit|alert|emerg] 级别越少,信息越少,生产使用warn|error|crit即可。
22. nginx访问日志
1. 定义访问日志格式
log_format main 'nginx日志变量';
常见的日志变量:
$remote_addr 访问网站的客户端地址
$http_x_forwarded_for 当前端有代理服务器时,设置web节点记录客户端地址,前提是代理服务器要使用x_forwarded_for
$remote_user 远程客户端用户名称
$time_local 记录访问时间和时区
$request 用户的http请求首行
$status http状态码
$body_byptes_sents 响应体大小
$http_referer 记录此次请求从哪个链接访问过来的,可以根据referer进行防盗链
$http_user_agent 记录客户端访问信息
$request_time 客户端请求耗时,单位为秒
2. 日志记录的配置
access_log file main;
3. 访问日志配置实战
log_format在http标签配置
[root@rsync-server conf]# cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$request_time"';
sendfile on;
keepalive_timeout 65;
server {
listen 81;
server_name 192.168.0.201;
location / {
root html/learning;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 82;
server_name 192.168.0.201;
location / {
root html/www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 83;
server_name 192.168.0.201;
location / {
root html/learning;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 83;
server_name 192.168.0.202;
location / {
root html/www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include website/learning.conf;
include website/www.conf;
}
access_log在server标签配置
root@rsync-server website]# cat learning.conf
server {
listen 80;
server_name learning.cmr.com.cn a.cmr.com.cn;
access_log logs/learning.txt main;
location / {
root html/learning;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ .*\.(php|php5)?$ {
root html/learning;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location /status {
stub_status on;
access_log off;
}
}
4. 访问日志切割
简单的脚本:
[root@rsync-server scripts]# cat access_log.sh
#!/bin/bash
logurl="/application/nginx/logs"
cd ${logurl}
mv learning.log "learning"`date +'%F'`.log
/application/nginx/sbin/nginx -s reload
[root@rsync-server scripts]# crontab -l
37 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >>/tmp/ntp.log
39 18 * * * /bin/sh /server/scripts/access_log.sh >/dev/null 2>&1
5. access_log标签使用的位置
可以使用在http,server,location中。
也可以自定义变量。
log_format back_log '$http_host $remote_addr $upstream_addr [$time_local] "$request" $status $body_bytes_sent "$username_cookie#$request_body" "$http_user_agent" $upstream_response_time $request_time';
log_format back_log_no_request_body '$http_host $remote_addr $upstream_addr [$time_local] "$request" $status $body_bytes_sent "$username_cookie" "$http_user_agent" $upstream_response_time $request_time';
set $username_cookie "";
if ($http_cookie ~* "username=(.+?)(?=;|$)") {
set $username_cookie $1;
}
参考文档:
23. nginx的location指令
1. location的作用
根据用户请求的URI来执行不同的应用。
2. location的语法
location [= | ~ | ~* | ^~ ] uri {
...........
}
1. = 表示精确匹配
2. ~ 表示匹配正则表达式(区分大小写)
3. ~* 表示匹配正则表达式(不区分大小写)
4. ^~ 表示匹配常规字符串后,不做正则表达式的匹配
5. !~ 表示不匹配正则表达式(区分大小写)
6. !~* 表示不匹配正则表达式(不区分大小写)
3. location的匹配规则顺序
25. nginx的认证
1. 认证可以设置在http,server,location标签中。
2. 认证主要有两个参数,一个用来启用认证,一个指定认证账号和密码。
auth_base string | off;
auth_basic_user_file file_path;
3. 实战例子:
[root@nginx-server-proxy conf]# cat ceshi.conf
server {
listen 90 ;
server_name 172.16.252.212 ;
location / {
root html/ceshi;
index index.html;
auth_basic "cehsi";
auth_basic_user_file /application/nginx/conf/htpasswd;
}
}
使用htpasswd命令生成用户名和密码。
htpasswd -bc /application/nginx/conf/htpasswd yangjianbo 123
26. 访问nginx的时候,出现403forbidden错误的原因
1. 当访问目录没有index文件的时候,会报出403错误。html/ceshi目录下没有index.html文件。
[root@nginx-server-proxy ceshi]# cat /application/nginx/conf/ceshi.conf
server {
listen 90 ;
server_name 172.16.252.212 ;
location / {
root html/ceshi;
index index.html;
auth_basic "cehsi";
auth_basic_user_file /application/nginx/conf/htpasswd;
}
}
2. 当配置文件中的index参数没有的时候,会报出403错误。
[root@nginx-server-proxy conf]# cat ceshi.conf
server {
listen 90 ;
server_name 172.16.252.212 ;
location / {
root html/ceshi;
#index index.html;
auth_basic "cehsi";
auth_basic_user_file /application/nginx/conf/htpasswd;
}
}
3. 当nginx用户没有页面文件的访问权限的时候,也会报错403。
[root@nginx-server-proxy ceshi]# chmod 700 index.html
4. 在server或者location标签中,设置了访问控制。
[root@nginx-server-proxy conf]# cat ceshi.conf
server {
listen 90 ;
server_name 172.16.252.212 ;
location / {
allow 172.16.20.149;
deny all;
root html/ceshi;
index index.html;
#auth_basic "cehsi";
#auth_basic_user_file /application/nginx/conf/htpasswd;
}
}
27. nginx的web服务优化实战
1. 隐藏nginx版本
在http模块添加下面的内容:
server_tokens off;
2. 配置worker进程数
3. 配置cpu亲和性
4. 配置worker进程并发连接数
5. 配置文件打开数
6. 配置高效传输模式
在http模块添加下面的内容:
sendfile参数用于开启文件的高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设置为on。
sendfile on;
tcp_nopush on;
tcp_nodelay on;
7. 配置nginx限制客户端请求体的大小
在主配置文件 的http标签,添加下面参数:
client_max_body_size 8m;
参数作用:设置最大的允许的客户端请求主体大小,在请求头域"content-Length",如果超过了此配置值,客户端会收到413错误。
此参数设置为0,表示禁止检查客户端请求主体大小。
9. 配置gzip
location ~* .(css|js)$ {
expires 240h;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 3;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
}
10. 配置epoll模型
11. 配置防爬虫
在server块中添加,如下信息:
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot")
{
return 403;
}
if ($http_user_agent ~* "mpcrawler" ) {
return 302 https://www.baidu.com;
}
28. nginx的反向代理与负载均衡
29. nginx如何支持https站点
31. nginx的信号控制
32. nginx负载均衡监测节点状态
1. 模块名称:nginx_upstream_check_module
用于主动式后端服务器健康检查
2. Tengine原生支持这个模块,而nginx则需要打补丁将该模块添加到nginx中。
补丁地址:https://github.com/yaoweibin/nginx_upstream_check_module
3. 安装nginx_upstream_check_module这个模块
wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master
unzip master
cd nginx-1.6.3
patch -p1 < ../nginx_upstream_check_module-master/check_1.5.12+.patch
./configure --prefix=/usr/loca/nginx/ --add-module=../nginx_upstream_check_module-master
make 如果第一次装还需要执行make install,如果已经安装过nginx,只执行make就可以了。
4. 例子:
http {
upstream cluster {
# simple round-robin
server 192.168.0.1:80;
server 192.168.0.2:80;
check interval=5000 rise=1 fall=3 timeout=4000;
#check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;
#check interval=3000 rise=2 fall=5 timeout=1000 type=http;
#check_http_send "HEAD / HTTP/1.0\r\n\r\n";
#check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80;
location / {
proxy_pass http://cluster;
}
location /status {
check_status;
access_log off;
allow SOME.IP.ADD.RESS;
deny all;
}
}
}
标红的表示:每5秒检查一次,请求一次正常则标记realserver为up,如果检测3次失败,就标记为down,
33. nginx常见错误
1. upstream timed out(110: connection timed out) while reading response header from upstream
解决方法:
2. 2019/10/11 05:05:42 [crit] 22938#0: *39617914 SSL_do_handshake() failed (SSL: error:140A1175:SSL routines:SSL_BYTES_TO_CIPHER_LIST:inappropriate fallback) while SSL handshaking, client: 208.100.26.235, server: 0.0.0.0:443
解决方法:
4.Systemd 命令和 sysvinit 命令的对照表
5.Sysvinit 运行级别和 systemd 目标的对应表
一往无前虎山行,拨开云雾见光明