- 下载
wget http://nginx.org/download/nginx-1.16.1.tar.gz
- 解压:
tar -zxvf nginx-1.16.1.tar.gz
- 进入解压目录:
cd nginx-1.16.1
- 安装
./configure --prefix=/opt/nginx --with-http_gzip_static_module --with-http_v2_module --with-openssl=/opt/openssl-1.1.1d --with-http_ssl_module --with-ipv6 # 可以提前输入 ./configure --help 来查看所有选项; # 带 PATH 的代表安装路径,sbin路径、modules路径、conf路径、prefix安装路径、pid路径 # --with开头 表示安装第三方动态模块,--without开头 表示取消已安装模块;--user 和 --group 代表分配的用户和用户组
- 编译、安装:
# 编译 make # 安装 sudo make install
- 启动
sudo /opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf # -c 初次启动指定配置文件的路径。不加 nginx会自动加载默认路径的配置文件。
- 运行
/opt/nginx/sbin/nginx -h # 显示帮助信息 -v 版本 -V 展示运行参数 (测试:-t -T会列出源文件)-q 安静 -s:signal -p:prefix -c:filename -g:directives /opt/nginx/sbin/nginx -s reload # 重新加载配置; /opt/nginx/sbin/nginx -s reopen # 重新打开日志;等同于 kill -USR1 PID /opt/nginx/sbin/nginx -s stop # 快速停止;等同于 kill -TERM/INT PID /opt/nginx/sbin/nginx -s quit # 停止接受请求+处理完后关闭;等同于 kill -QUIT PID /opt/nginx/sbin/nginx -g "pid logs/nginx.pid" # 添加配置
- nginx 安装后,可选择添加[nginx.service]:vim /usr/lib/systemd/system/nginx.service
[Unit] Descripitoin=nginx web service Doucumentation=http://nginx.org/en/docs/ After=network.target [Service] Type=forking PIDFile=/opt/nginx/logs/nginx.pid ExecStartPre=/opt/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf ExecStart=/opt/nginx/sbin/nginx ExecReload=/opt/nginx/sbin/nginx -s reload ExecStop=/opt/nginx/sbin/nginx -s stop PrivateTmp=true [Install] WantedBy=default.target
# 授权 authorize chmod 755 /usr/lib/systemd/system/nginx.service # operator systemctl start/stop/restart/reload/status/enable nginx # 其中重载reload,体现在 master 进程号不变,worker进程号修改了
- 将nginx命令配置到环境变量
export PATH=$PATH:/opt/nginx/sbin
- kill 命令信号:TERM/INT、 QUIT、 HUP、 USR1、 USR2、 WINCH
- nginx 卸载
./nginx -s stop && rm -rf /opt/nginx && make clean # make clean 其实就是清理生成的 Makefile 和 objs/ 文件Nginx 目录
- conf:里面包含一些cgi(Common Gateway Interface)通用网关「接口|程序」相关的配置,还有编码转换相关的文件(koi-utf、koi-win、win-utf)还最后的 nginx 配置文件。
- html:网页
- logs:访问日志、错误日志、nginx进程的PID
- sbin:执行文件
-
nginx 是通过多进程的方式运行的:ps -ef |grep nginx
-
nginx 主要有两类进程
- master(主进程、不处理业务、协调worker进程、校验配置文件)
- worker(读取conf配置、加载对于资源、解析并响应)
-
管理员向master发送信号,master再向worker发送信号;worker进程和用户进行连接;
-
重新打开日志文件:kill -USR1 PID;重新读取配置文件并生效 -HUP
-
优雅关闭整个服务:kill -TERM/INT PID;所有子进程不在接收处理新连接:-WINCH(只关闭worker进程)
-
平滑升级:kill -USR2 PID # 这样会复制一份,并得到nginx.pid.oldbin文件,再继续运行kill -QUIT OLDPID 这样平滑更新就完成了。
-
nginx 使用服务信号升级
# 准备工作 ./configure && make && make install # 旧版 ./configure && make # 新版 # 备份原有的二进制 nginx mv nginx oldnginx # 更新 nginx 二进制文件 cp ~/nginx-1.17.1/objs/nginx /usr/local/nginx/sbin/ # 复制得到新的进程(根据新的二进制文件运行的进程) kill -USR2 'more /usr/local/nginx/logs/nginx.pid' # 退出旧版本 kill -QUIT 'more /usr/local/nginx/logs/nginx.pid.oldbin'
- nginx 使用make命令升级
# 准备工作 ./configure && make && make install # 旧版 ./configure && make # 新版 # 备份原有的二进制 nginx mv nginx oldnginx # 更新 nginx 二进制文件 cp ~/nginx-1.17.1/objs/nginx /usr/local/nginx/sbin/ # 在新版本的根目录下执行 make upgrade
- nginx 更新模块
# 查看之前安装的模块有哪些(需要添加到后面) nginx -V # 清理 make clean # 模块更新 ./configure --without.... --with... # 编译 make # 更新 mv objs/nginx /opt/nginx/sbin/ && make upgradeNginx 核心配置
- 配置文件 /usr/local/nginx/conf/nginx.conf 由三大块组成;
- 全局块:http 和 events 之外的配置都是全局(指令名:指令值;既 -g 可以加的配置)
- events 块:与用户网络连接相关的内容,性能相关。如 use epoll;
- http 块:可以配置多个 server 块(端口+主机名+location块+error_page)
# worker 进程的用户,可以 useradd www,然后设置为www(会添加一个/home/www/目录方便配置)
user www;
# 是否开启工作进程,主要用于测试,需要重启,只留一个nginx进程(不区分master worker)
master_process off; # default on;
# 开启多少个worker进程,实现并发。适合为cpu物理内核数,超了会分时(也可以叫业务进程)
worker_processes auto;
# 是否以守护进程启动
daemon off; # default on;
# pid 文件路径
pid file;
# 错误日志存放路径(不记录访问请求),还包括日志级别:debug info notice warn error crit alert emerg
error_log file error; # 不建议 info 以下级别,会有大量 I/O
# 事件驱动模块
events {
# 单个worker进程最大连接数;不能大于系统支持的最大文件句柄数
worker_connections 1024;
# 网络连接序列化,解决 “惊群” 问题(一根領打扰到所有)但 33領时效率较慢不如竞争。需根据请求频率进行设置
accept_mutex on; # default on, could set off
# 单个worker是否能接收多个请求(设为on能提高效率)
multi_accept on; # default off;
# 设置 nginx 服务器使用哪种事件驱动来处理多路复用(方式)
use epoll; # select/poll/epoll/kqueue 也可以在编译时 --with-select_module --with-poll_module 来选择(最终以配置文件为主)
}
# 实现 Http服务,走 http 协议
http {
# 引用文件
include mime.types; # 服务器返回文件类型 内容为:types { text/css css; application/json json;} 这里 /etc/nginx/mime.types 和 mime.types
# 不包含在 types里面的,默认为什么类型(type):流的方式
default_type application/octet-stream;
# 数据零拷贝;是否使用Linux 提供的 sendfile()这个函数来进行传输
sendfile on;
# 长连接的超时时间,单位默认是 s秒
keepalive_timeout 65;
# keep-alive 连接最多使用的次数
keepalive_requests 100;
include /etc/nginx/conf/*.conf;
# 一个 server 代表一个虚拟主机 vhost(通过端口区分)
server {
# 监听端口号:127.0.0.1:80指定ip+指定端口;127.0.0.1指定ip;*:8080 或 8080指定端口;
# 没有匹配到 server_name 会默认去找第一个server ,要指定默认server,添加 default_server 属性;
listen 80;
# 主机名 或 域名:www.baidu.com *.baidu.com 多个用空格隔开;wildcard *只能出现在首段/尾段;波浪形正则:~^正则表达式$;
server_name localhost;
# 子目录/路径
location / {
# 资源所匹配的目录(不配置,默认为当前目录的 html 文件夹)
# root是网站根目录的逻辑概念,物理上表示为文件夹。
root html;
# /斜杠时走的默认页(不配置,默认为 index.html 文件)
index index.html index.htm;
}
# 错误码跳转
error_page 500 502 503 504 /50x.html;
location = /50x.html {
# /usr/share/nginx/html 和 html都行(相对路径 和 绝对路径 都行)
# root 会将 location 地址附加到末尾
root /usr/share/nginx/html;
# 默认页;没有这步设置,也会将location附加到root末尾,起到同样效果,主要是给/用的;
index 50x.html;
}
}
server {
listen 80;
server_name ~^www.(w+).com$;
default_type text/plain;
return 200 '--> access $1';
}
# 防止恶意域名解析
server {
# 匹配顺序:精确->前通配符->后通配符->正则->default_server->第一个server
listen 80 default_server;
server_name _;
return 444;
}
}
vim 可视化操作:ctrl-v + I/d + input + ESC
:set nu 开启行号;
:24,28d 删除对应行
- 虚拟主机(一台主机一个站点太浪费了)
目录:baidu.com -> /www/baidu.com
目录:blog.baidu.com -> /www/blog.baidu.com
- root 和 alias
- root 最上层目录,结果为:root路径 + location路径
- alias 目录别名,结果为:alias路径 替换 location路径(小心结尾斜杠/,alias直接替换是否会缺失)
- index 默认首页(可以是图片等)从前往后,找到第一个为止;
- error_page code... [=[response]] uri; # server可以配置多个error_page
- 结合 error_page 404 @errorxx; location @errorxx {…}(@表示仅内部请求重定向, 不直接处理用户请求)
- 修改返回状态码:error_page 404 =200 /50x.html; 浏览器就能显示为 200(=号前有空格,后没有空格)
- location [ = | ~ | ~* | ^~ | @] uri {....}
- 不带符号必须以指定uri开始 /abc 可以匹配 /abcef;使用 = 等号则必须精确匹配;
- ~ 表示包含正则区分大小写;~* 表示正则不区分大小写;(注意缓存)
- ^~ 用于不包含正则表达式的uri前,如果匹配则不搜索其他模式(短路)
- 上面的匹配过程是,顺序匹配,匹配所有成功的,最后执行最后一个匹配的 location;
- @表示仅用于Nginx服务器内部请求之间的重定向, 带有@的location不直接处理用户请求.
- 动静分离:动态资源使用 proxy_pass,静态资源 nginx 本地转发;
- urlRewrite:/item/100 -> /itemService?id=100
- flag标记说明:last(继续向下匹配)break(匹配完直接终止)redirect(302临时重定向,浏览器显示跳转后的URL)permanent(301永久重定向,浏览器显示跳转后的URL)
- 反向代理 proxy_pass:用来代理服务器地址,可以是主机名称、IP地址加端口号的形式
- URL:包含传输协议(http,https://)如果 location 结尾加“/”是不包含location的。location /server -> 代理后加;location /server/ -> 代理后不加
- proxy_set_header:准备工作return 200 $http_username; 代表返回请求头里的username参数;proxy_set_header username TOM; 这个参数等主要作用是为了记录真实的主机地址,毕竟做了一遍代理;
- proxy_redirect http://192.168.200.146/ http://192.168.200.133/ 后一个是本机地址,作用是替换重定向地址(重定向LocationUrl),可以替换为 default(或off)。被转发的服务器:if(!-f $request_filename) { return 302 http://192.168.200.146/; }然后本机的 location / 可以设置为proxy_pass http://192.168.200.146/ 来起到URL不变的效果。另外因为是整个转发,所以本机并不知道访问得到的是错误地址,所以不会有error日志。
- 负载均衡 upstream:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
http {
# 服务器组(The ngx_http_upstream_module module is used to define groups of servers that can be referenced by the proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, and grpc_pass directives.)
upstream: httpUpstream {
# 负载均衡策略:ip_hash、least_conn、least_time、url_hash、fair、ntlm、random
ip_hash;
# 不写上面的话默认为轮询;后面的附加内容「权重:weight;不参与负载均衡:down(对应的是 up 因为默认所以不用写);所有服务器都不能访问时访问的备用机:backup」
server 192.168.44.44:80 weight=8;
server 192.168.44.43:80 weight=2 backup;
server 192.168.44.42:80 weight=2 down;
}
server {
listen 80;
server_name localhost;
location / {
# urlRewrite
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
proxy_pass http://www.google.com;
}
location /httpUpstream {
# 使用upstream就不要写端口了,因为具体到集群里端口号并不相同
proxy_pass http://httpUpstream;
}
# 波浪线 ~代表正则 *代表大小写不敏感
location ~*/(js|css|img) {
proxy_pass http://httpUpstream;
}
}
其他负载均衡策略:ip_hash、least_conn、url_hash、fair(响应时间,会受到流量倾斜)、ntlm(The upstream connection is bound to the client connection once the client sends a request with the “Authorization” header field value starting with “Negotiate” or “NTLM”. )
七层负载均衡:主要是基于虚拟 URL 或主机IP 的负载均衡;主要是 nginx
四层负载均衡:主要是 ip+port 的负载均衡;如软件的 LVS 和 nginx(–with-stream),硬件的 F5 机器
- Rewrite 功能配置
- urlRewrite:/item/100 -> /itemService?id=100
- 语法:rewrite regex replacement [flag];
- flag标记说明:last(能作为新 URL 继续匹配其他 location 块)break(作为新 URL 在本块中继续处理,不会去其他 location 块)redirect(302临时重定向,浏览器显示跳转后的URL)permanent(301永久重定向,浏览器显示跳转后的URL)
- rewrite_log on|off 重写日志记录功能,开启后将以 notice 级别输出到 error_log 中(error_log file [error | debug | info | notice | warn | error | crit | alert | emerg];)
server_name_in_redirect off 在0.8.48之前默认为 on 需要设置为 off
- 静态资源优化:
- sendfile on; 使用sendfile() 函数来代替read和write函数,使得文件读取到内核缓冲区后,直接发送到socket缓冲区发送文件。替换之前的先read()到应用程序缓冲区,再write()到socket缓冲区;(“虚拟文件”:/dev/mem 可以用于读取内存的内容)
- tcp_nopush on; sendfile开启后才生效,提升效率(别急,存满再发)
- tcp_nodelay on; keepalive开启后才生效,提高实时性(别耽误,有数据就发)
- nopush 和 nodelay 看起来是互斥的,但在Linux2.5.9之后可以兼容(判断是否足后一个包。nopush优先数据包装满立即发,末尾最后一个未装满则忽略nopush直接发送),所以上面三个都建议打开;
- keepalive_timeout 65; 默认秒
{
upstream webservice {
server 192.168.10.100:8080;
}
server {
listen 80;
server_name localhost;
location /demo {
proxy_pass http://webservice;
}
location ~/.*.(png|jpg|gif|js) {
root html/static;
}
location / {
root html/static;
index index.html index.htm;
}
}
}
Nginx 静态资源压缩实战
nginx可以通过配置gzip来对静态资源进行压缩,相关的指令可以配置在http、server和location块中。
相关模块有:ngx_http_gzip_module、 ngx_http_gzip_static_module 、ngx_http_gunzip_module 三个模块
- 开启:giz on; & gzip_types mime-type ... (默认只对text/html;仅测试可以用:gzip_types *; )
- 级别:gzip_comp_level 6 (low1-9hight)
- 告知:gzip_vary on default off;告知respond头启用了压缩:Vary: Accept-Encoding
- 缓冲区数量和大小:gzip_buffers 32 4k | gzip_buffers 16 8k number size;
- 不支持的浏览器不压缩:gzip_disable "MSIE [1-6].";
- 压缩响应所需的最低 http 请求版本:gzip_http_version 1.1;
- 太小的就不压缩:gzip_min_length 1k; 不写默认bytes字节,取得是Content-Length的值
- 代理:gzip_proxied off|expired|no-cache|no-store|private|auth|any
Gzip 和 sendfile 共存问题
- 引入ngx_http_gzip_static_module 模块,使用gzip_static off|on|always指令
expires [modified] time; (单位为秒)
expires epoch|max|off; (max 十年;epoch no-cache;off 默认不缓存)
主要跟 Expires (http1)和 Cache-Control (http1.1) 头有关;Cache-Control: max-age=1000;
添加指定的响应头和响应值:add_header Cache-Control no-cache;
跨域问题解决同源策略:是一种浏览器最核心也是最基本的安全功能。(同源指:协议、域名/IP、端口 相同)
添加响应头:add_header Access-Control-Allow-Origin *;
添加响应头:add_header Accesss-Control-Allow-Methods GET,POST,PUT,DELETE;
防盗链valid_referers none|blocked|server_names|string…
如果匹配到了 $valid_referers的值就为 0;没匹配到就是 1;
location / {
# 可以设置 none、blocked、[server_names]、[ip] 可以写多个以空格分开
valid_referers none 192.168.0.101;
if (valid_referers) {
return 403;
}
root html;
index index.html index.htm;
}
- if 命令:nginx 上的 if 后面必须跟空格,且判断符号如 = 、 != 、~ 符号等的前后都需要加空格;(其中正则表达式匹配 ~ 可以只匹配一部分内容)
- break 指令:同一作用域后面的配置无效,且 终止当前匹配把当前 URI 在本 location 块中进行重定向访问处理(取消 return 的作用不会跳转到别的地方,而去找本块的 root 和 index 进行重定向访问)。
server {
listen 80 default_server;
server_name _;
access_log off;
return 444;
}
域名转发
server {
listen 80;
server_name aa.com bb.com;
access_log off;
rewrite ^(.*) http://cc.com$1;
}
https
{
# HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.bibi.com bibi.com;
location / {
return 301 https://$server_name$request_uri;
root html;
}
}
}
Keepalived 之 VRRP 原理
virtual route redundancy protocol 协议,虚拟路由冗余协议。能将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由IP;存在竞争(选择协议)有 master 和 backup 两种节点;master 需要在指定的时间间隔内,对外汇报自己的健康状态;在 master 出问题后,backup 根据优先级来进行竞争。
vrrp 协议:选择协议 + 路由容错协议(竞争 + 心跳-替换)
下载站点+用户认证{
server {
location /download {
root /usr/local; # 访问/usr/local/download目录
autoindex on; # 开启站点,npx_http_autoindex_module 模块
autoindex_exact_size off;
autoindex_format html; # json
autoindex_localtime on;
auth_basic "information to display"; # ngx_http_auth_basic_module 模块
auth_basic_user_file customize_file_name;
}
}
}
使用 http password 生成器:httpd-tools
htpasswd -c /xxx/ username htpasswd -b /xxx/ username password htpasswd -D /xxx/ username # delete htpasswd -v /xxx/ username # verify



