准备
下载
四个常用版本
- Nginx开源版 http://nginx.org/
- Nginx plus 商业版 https://www.nginx.com
- openresty http://openresty.org/cn/
- Tengine http://tengine.taobao.org/
安装
解压
tar zxvf nginx-1.21.6.tar.gz
进入目录
cd nginx-1.21.6
选择编译安装
./configure --prefix=/usr/local/nginx
make
make install
测试
进入/usr/local/nginx/sbin
cd /usr/local/nginx/sbin
测试
./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 重新加载配置
验证启动
通过 ip addr 查询IP地址
浏览器访问
防火墙可能会导致访问超时
关闭防火墙
systemctl stop firewalld.service
禁止防火墙开机启动
systemctl disable firewalld.service
放行端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload
安装成系统服务
创建服务脚本
vi /usr/lib/systemd/system/nginx.service
脚本服务内容
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重新加载系统服务
systemctl daemon-reload
启动服务
systemctl start nginx.service
开机启动
systemctl enable nginx.service
基础使用
目录结构
进入Nginx的主目录我们可以看到这些文件夹
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件
client_body_temp fastcgi_temp proxy_temp scgi_temp
conf 用来存放配置文件相关
html 用来存放静态文件的默认目录 html、css等
sbin nginx的主程
基本运行原理
Nginx配置与应用场景
worker_processes
worker_processes 1; 默认为1,表示开启一个业务进程
worker_connections
worker_connections 1024; 单个业务进程可接受连接数
include mime.types;
include mime.types; 引入http mime类型
default_type application/octet-stream;
default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。
sendfile on;
sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
未开启sendfile
开启后
keepalive_timeout 65;
keepalive_timeout 65;
server
虚拟主机配置
server {
listen 80; 监听端口号
server_name localhost; 主机名
location / { 匹配路径
root html; 文件根目录
index index.html index.htm; 默认页名称
}
error_page 500 502 503 504 /50x.html; 报错编码对应页面
location = /50x.html {
root html;
}
}
虚拟主机
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务(参见上面的server)
最简单的测试是把修改本机的 hosts 文件,添加本机域名解析,把配置的虚拟主机的server_name与虚拟主机的ip地址相联系,然后本机的浏览器就可以通过域名(server_name)访问了
如果希望外网也能访问,可以在阿里云购买一个域名,对于购买的域名我们可以设置多个二级域名(即实现多用户二级域名系统,涉及到下面讲的反向代理),这样就能体现虚拟主机设置server_name 的作用了,当我们为不同的虚拟主机设置不同的 server_name 后,外网通过不同的二级域名就可以从同一个ip地址 获取不同的响应
servername匹配规则
需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。
完整匹配
我们可以在同一servername中匹配多个域名
server_name vod.mmban.com www1.mmban.com;
通配符匹配
server_name *.mmban.com
通配符结束匹配
server_name vod.*;
正则匹配
server_name ~^[0-9]+\.mmban\.com$;
反向代理
概念
重点在于代理 ,Nginx 为用户请求提供 代理,即为用户转发请求给应用服务器,在互联网和应用服务器之间建立沟通的桥梁。
反向,正向 是相对而言的,对于用户来说 Nginx是由 服务方 提供的,因此是反向。当用户由 网关 向外网获取消息时,网关起到的的就是正向代理的作用,因为这是客户自己提供的
配置
修改配置文件中的 虚拟主机server ,这时就实现了代理的功能
location / {
proxy_pass http://atguigu.com/;
}
传统公司系统架构
Nginx在其中发挥请求中转的作用
负载均衡
基本配置,在配置文件中添加
upstream httpd {
server 192.168.44.102:80;
server 192.168.43.103:80;
}
概念
顾名思义,当一台服务器不可用(如,负载达到上限或者一定值)时,Nginx可以把业务分配给其他服务器(大概就这个意思)
策略
轮询 默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求。
weight(权重) 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream httpd {
server 127.0.0.1:8050 weight=10 down;
server 127.0.0.1:8060 weight=1;
server 127.0.0.1:8060 weight=1 backup;
}
- down:表示当前的server暂时不参与负载
- weight:默认为1.weight越大,负载的权重就越大。
- backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。
动静分离
概念
把原本属于服务器的静态资源交给Nginx,这样当用户请求静态资源时就不需要Nginx代理从服务器中获取资源再转发。目的是为了减小服务器的压力。但仅适用于静态资源较少的中小型项目
配置
增加每一个资源对应的location(将服务器中的资源删除并移动到Nginx上后)
location /css {
root /usr/local/nginx/static;
index index.html index.htm;
}
location /images {
root /usr/local/nginx/static;
index index.html index.htm;
}
location /js {
root /usr/local/nginx/static;
index index.html index.htm;
}
location详解
location 前缀
- / 通用匹配,任何请求都会匹配到。
- = 精准匹配,不是以指定模式开头
- ~ 正则匹配,区分大小写
- ~* 正则匹配,不区分大小写
- ^~ 非正则匹配,匹配以指定模式开头的location
location匹配顺序
- 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
- 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
- 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
- 所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)
location ~*/(css|img|js) {
root /usr/local/nginx/static;
index index.html index.htm;
}
UrlRewrite
rewrite语法格式及参数语法
根据regex (正则表达式)部分内容, 重定向到replacement,结尾是flag标记。
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记
flag标记说明:
- last #本条规则匹配完成后,继续向下匹配新的location URI规则
- break #本条规则匹配完成即终止,不再匹配后面的任何规则
- redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
- permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地
实例:
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break
反向代理 + 负载均衡 + UrlRewrite
upstream httpds {
server 192.168.44.102 weight=8 down;
server 192.168.44.103:8080 weight=2;
server 192.168.44.104:8080 weight=1 backup;
}
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 redirect;
proxy_pass http://httpds ;
}
防盗链
概念
反向代理,页面的引用等 都是二次对资源进行请求,所有的二次请求都会带有原来请求的地址,可以帮助Nginx判断这个请求是自己本来就允许的站点,还是非法站点(引用非法)
配置
valid_referers none | blocked | server_names | strings ....;
- none, 检测 Referer 头域不存在的情况。
- blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。
- server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。
在需要防盗链的location中配置
valid_referers 192.168.44.101;
if ($invalid_referer) {
return 403;
}
高可用配置
解决问题
我们用负载均衡实现了当一个服务器挂掉时,Nginx可以选择别的服务器发送请求。那么如果Nginx挂掉呢,如果我们仍采用一个新的Nginx来管理该Nginx和他的备份,那么如果新的Nginx挂掉呢?所以这是一个套娃,是行不通的
keepalived
keepalived能够控制一个虚拟地址,使其在主Nginx和备份Nginx之间切换,主和备的真实ip地址保持不变,仅仅是改变虚拟地址。该虚拟地址即是用户所请求的地址,所以keepalived只要保证虚拟地址能够及时的转移到可用的Nginx上就可以了
编译安装
下载地址 https://www.keepalived.org/download.html#
使用 ./configure 编译安装
如遇报错提示
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!
安装依赖
yum install openssl-devel
yum安装
yum install keepalived
配置
使用yum安装后配置文件在
/etc/keepalived/keepalived.conf
最小配置
第一台机器
! Configuration File for keepalived
global_defs {
router_id lb111
}
vrrp_instance atguigu {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.44.200
}
}
第二台机器
! Configuration File for keepalived
global_defs {
router_id lb110
}
vrrp_instance atguigu {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.44.200
}
}
启动服务
systemctl start keepalived
Https证书配置
不安全的http协议
http协议传输过程中不安全
解决:通过加密算法,传输密文
对称加密算法
无论怎么优化,因其对称性永远无法保证安全
非对称加密算法
(满足一个特性,公私能互解,但是公公解不开),即https的底层算法
但也不安全,例如当用户发送获取公钥的请求后,拦截者可以将其拦下,代替其去获取公钥,并返回给用户一个假的公钥。这样用户-拦截者-服务器之间就建立起了连接,显然这样就不安全了。
CA签名
上述问题简单的来说就是 你获得的公钥不可靠
解决
- 服务器向CA机构提交包括自己的公钥在内的一系列资料
- CA机构通过利用自己的 私钥 + 非对称加密算法将 服务器提交的公钥 加密后生成 证书
- 将证书还给服务器
- 当用户向服务器申请公钥时,服务器向其发送证书
- 因为CA机构是个实实在在的涵盖很广的一个机构,所以你的操作系统可以提前知道CA机构的私钥对应的公钥(即公钥内置在系统里),所以当你收到证书时,如果你可以用内置的公钥解开它,那么它必定是安全的(拦截者无法获得CA机构的私钥,不能伪造证书)
951420)]
非对称加密算法
(满足一个特性,公私能互解,但是公公解不开),即https的底层算法
[外链图片转存中…(img-77z0IO1M-1649250951421)]
但也不安全,例如当用户发送获取公钥的请求后,拦截者可以将其拦下,代替其去获取公钥,并返回给用户一个假的公钥。这样用户-拦截者-服务器之间就建立起了连接,显然这样就不安全了。
CA签名
[外链图片转存中…(img-V0U7zyb2-1649250951422)]
上述问题简单的来说就是 你获得的公钥不可靠
解决
- 服务器向CA机构提交包括自己的公钥在内的一系列资料
- CA机构通过利用自己的 私钥 + 非对称加密算法将 服务器提交的公钥 加密后生成 证书
- 将证书还给服务器
- 当用户向服务器申请公钥时,服务器向其发送证书
- 因为CA机构是个实实在在的涵盖很广的一个机构,所以你的操作系统可以提前知道CA机构的私钥对应的公钥(即公钥内置在系统里),所以当你收到证书时,如果你可以用内置的公钥解开它,那么它必定是安全的(拦截者无法获得CA机构的私钥,不能伪造证书)