Nginx
简介:
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2022年01月25日,nginx 1.21.6发布。
Nginx是一款轻量级的Web服务器反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
一、 安装
1.下载
2.将.tar.gz文件放到/opt
目录下(其他目录也行),解压文件
tar -zxvf nginx-1.21.6.tar.gz
3.cd进入解压目录,执行安装命令(安装到了 usr/local/nginx)
./configure --prefix=/usr/local/nginx
4.再执行
make
make insatll
5.查看/usr/local
是否有nginx目录
6.防火墙开放端口(如果是云服务器,还需要手动添加端口)
firewall-cmd --zone=public --add-port=80/tcp --permanent # 开放80端口
firewall-cmd --reload # 重启
7.为了方便全局操作nginx,添加服务脚本
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 # 重启服务
8.重启nginx服务
systemctl reload nginx
systemctl enable nginx.service # 开机启动
二、基本使用
目录结构
其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件
client_body_temp fastcgi_temp proxy_temp scgi_temp
-
conf: 用来存放配置的文件
-
html: 用来存放静态文件的默认目录html、css
-
sbin: nginx的主程序
运行原理
说明:
浏览器到达nginx服务器,ngxin接收到请求后,会开启多个进程来处理,其中
master
进程是来管理worker
进程的,而worker
进程是根据请求的uri
来获取服务器中的数据返回给浏览器。
Nginx配置文件
说明:
nginx.conf是主配置文件,其中可以引用其他配置文件。
文件内容:
完整配置文件
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
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" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# 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;
# }
#}
}
将注释删除,剩余的基本配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 9090;
server_name www.ease.center;
location / {
root www/www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置解释:
- worker_processes
默认为1,表示开启一个业务进程
- worker_connections
单个业务可接受的最大连接数
- include mime.types
引入http mime类型 该文件是用来标识服务给浏览器返回的数据类型的,方便服务器解析
- default_type application/octet-stream
如果mime类型没匹配上,默认使用二进制流的方式传输。
- sendfile on
使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝,这个拷贝指的是浏览器接收到了请求,根据请求找到了对应的数据,linux会将数据拷贝到缓存中,再拷贝到nginx缓存中,然后再返回,开启0拷贝,就不会经历这些拷贝过程。
开启前
开启后
- keepalive_timeout 65
保持连接,超时时间
- server
虚拟主机配置 vhost
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;
}
}
虚拟主机
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务。
虚拟主机域名配置
- 在ngin目录下创建两台主机文件夹并且分别在里面编写内容不同index.html,用来测试访问
vod/index.html 内容: this is a vod web site!!!
www/index.html 内容: this is a www web site!!!
- 修改nginx配置文件
server {
listen 9090;
# 配置主机域名
server_name www.ease.center;
location / {
# 配置主机资源路径
root www/www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 9090;
# 配置主机域名
server_name vod.ease.center;
location / {
# 配置主机资源路径
root www/vod;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
说明:
主机域名,支持
*.ease.center
, 这样标识前缀任意值,同时支持正则表达式。
- 测试访问结果
注意:
listen
和sever_name
组合起来必须不一样
# 监听端口
listen 9090;
# 配置主机域名
server_name vod.ease.center;
域名解析规则
- servername匹配规则
我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。
- 完整匹配
我们可以在同一servername中匹配多个域名
server_name vod.mmban.com www1.mmban.com;
- 通配符匹配
server_name *.mmban.com
- 通配符结束匹配
server_name vod.*;
- 正则匹配
server_name ~^[0-9]+\.mmban\.com$;
反向代理、正向代理模型
反向代理:
反向代理是指以代理服务器来接受连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器,而且整个过程对于客户端而言是透明的。
正向代理:
正向代理意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后由代理向原始服务器转交请求并将获得的内容返回给客户端。
两者区别:
两种代理方式的区别在于正向代理是为浏览器代理,而反向代理是为内部服务器在代理,将请求代理给内部服务器。
lvs(DR模型)
负载均衡
负载均衡也是Nginx常用的一个功能。当有请求发送到nginx时,nginx仅仅作为转发服务器,将请求转发给你其他服务器(一般都是两三台以上),达到方向代理的功能。
实现负载均衡步骤:
- 首先需要准备两台以上的服务端
由于缺少服务器原因,这里我使用不同端口号来代替 。
- 修改nginx代理服务器配置文件
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream cluster_server{
server 192.168.4.103:8080;
server 192.168.4.102:8080;
}
server {
listen 9090;
server_name www.ease.center;
location / {
# 负载均衡到cluster_server集群
proxy_pass http://cluster_server;
# root www/www;
#index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
说明:
此时访问9090端口就会分别轮询的访问
192.168.4.103:8080
和192.168.4.102:8080
负载均衡策略:
- weight: 权重
- down : 当前server暂不参与负载均衡
- backup : 预留的备份服务器; 其它所有的非backup机器down或者忙的时候,请求backup机器。
- max_fails : 请求失败次数限制
- fail_timeout : 经过max_fails后服务暂停时间
- max_conns : 限制最大的连接数
upstrem weiyigeek {
server ease.center:8080 down;
server ease.center:8081 backup;
server ease.center:8083 weight=10;
server ease.center:8084 weight=8;
server ease.center:8085 weight=1;
}
负载均衡调度算法
方式一: 轮询
对集群中的服务器轮流访问
upstream cluster_server {
server ease.center:8084;
server ease.center:8085;
}
方式二:权重
可以给不同服务器配置不同的权重,让他们的请求按照一定比例到达不同的服务器
upstream cluster_server {
server ease.center:8084 weight=8;
server ease.center:8085 weight=1;
}
方式三:ip_hash
根据客户端的请求ip计算出一个ip地址,然后相同的ip地址转发给同一台服务器
upstream cluster_server {
ip_hash;
server ease.center:8084;
server ease.center:8085;
}
方式四:fair
fair(第三方)按后端服务器 的响应时间来分配请求,响应时间短的优先分配。
upstream cluster_server {
fair;
server ease.center:8084;
server ease.center:8085;
}
方式5:least_conn
描述: 将请求分配到连接数最少的服务上。
upstream cluster_server {
least_conn;
server ease.center:8084;
server ease.center:8085;
}
方式6:url_hash
根据请求过来的url计算出一个hash值,根据hash值转发给不同的服务器,相同hash值转发给同一台服务器
upstream cluster_server {
url_hash;
server ease.center:8084;
server ease.center:8085;
}
动静分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动态资源处理交给服务器,页面显示的基本演示图片等放到nginx中,达到一个缓存的作用,前后端分离的项目,可以将前端页面数据放到nginx中
server {
listen 9090;
server_name www.ease.center;
# 将 /css、/img、/js 资源都从 /usr/local/nginx/www中找
location ~*/(css|img|js) {
root /usr/local/nginx/www;
index index.html index.htm;
}
location / {
proxy_pass http://cluster_server;
# root www/www;
#index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
location匹配顺序:
- 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
- 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
- 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
- 所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)
URLRewrite
基本规则:
rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记
标记说明:
- ast: 本条规则匹配完成后,继续向下匹配新的location URI规则
- break : 本条规则匹配完成即终止,不再匹配后面的任何规则
- redirect : 返回302临时重定向,浏览器地址会显示跳转后的URL地址 (防爬虫)
- permanent : 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
实际配置:
将/1.html 重写为真实请求uri /index.html/pageNo=1
location / {
rewrite ^/([0-9]+).html /index.html?pageNo=$1 break;
proxy_pass http://cluster_server;
}
负载均衡+URLRewrite
真正实现nginx变成网关,必须要实现浏览器请求无法直接访问后台服务器,必须通过nginx反向代理的请求才能到达后台服务器,所以要对nginx反向代理的服务器进行配置。
- 打开防火墙
systemctl start firewalld
- 指定端口的ip地址
后台服务器接收来192.168.44.101发到8080端口的请求
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101" port protocol="tcp" port="8080" accept"
- 重启防火墙
systemctl restart firewalld
firewall-cmd --reload
防盗链
就是防止浏览器页面对nginx服务器的静态资源的直接引用,我们可以在接收到请求反向代理之前,判断一下它的ip地址,如是我们自己的主机才进行访问。
http协议中的 referrer
Http协议头中的Referer主要用来让服务器判断来源页面, 即用户是从哪个页面来的,通常被网站用来统计用户来源,是从搜索页面来的,还是从其他网站链接过来,或是从书签等访问,以便网站合理定位.
vaild_referers none | blocked | sever_names |...
- none: 检测Referer 头域不存在,就可以访问
- blcoked: 检测Referer头域的值被防火墙或者代理服务器删除或者伪装的情况,这种情况头域的值不以“http://”或“https://”
- server_name: 设置一个或多个url,检测referer头域的值是否是这些url其中一个
配置:
location / {
vaild_referers 192.168.44.101;
if($invalid_referer){
return 403;
}
proxy_pass http://cluster_server;
}
# 可以配置给引用者返回默认图片
location = /403.html {
root html;
}
使用curl测试
curl -I http://192.168.44.101/img/logo.png
带引用
意思就是referer头是http://baidu.com
curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png
高可用
高可用就是保证如果一台nginx宕机或故障后,依然能够有其他的服务器来顶上使用,保证正常的运行,这里采用keepalived来实现,在keepalived中配置一个虚拟的ip地址,这个IP地址可以在主机和备用机之间切换,如果主机宕机或故障,就可以将ip切换到备用机上面,保证服务的正常。
keepalived安装使用
- 安装依赖
yum install openssl-devel
- 安装keepalived
yum install keepalived
- 配置keepalived
配置文件在
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { # 邮件配置
acassen@firewall.loc # keepalived 发生故障切换时邮件发送的对象,可以按行区分写多个
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL # route_id
vrrp_skip_check_adv_addr # 所有报文都检查比较消耗性能,此配置为如果收到的报文和上一个报文是同一个路由器则跳过检查报文中的源地址
# vrrp_strict # 严格遵守VRRP协议,不允许状况:1,没有VIP地址,2.配置了单播邻居,3.在VRRP版本2中有IPv6地址.
vrrp_garp_interval 0 # ARP报文发送延迟
vrrp_gna_interval 0 # 消息发送延迟
#vrrp_iptables # yum安装会自动生成防火墙策略,可以删除或禁止生成
}
vrrp_instance VI_1 {
state MASTER # 启动时,当前节点在此虚拟路由器上的初始状态。
interface eth0 # 心跳传输的网卡
virtual_router_id 51 # 当前虚拟路由器的惟一标识,范围是0-255,MASTER和BACKUP的值需要一样。
priority 100 # 当前主机在此虚拟路径器中的优先级;范围1-254;
advert_int 1 # vrrp通告的时间间隔;主备间通告时间检查的时间间隔,单位为s,默认1s
authentication { # 认证机制
auth_type PASS
auth_pass 1111 # 仅前8位有效
}
virtual_ipaddress { #虚拟IP
192.168.200.16
}
}
Https
不安全的http协议:
HTTP协议没有任何的加密以及身份验证的机制,非常容易遭到窃听、劫持、篡改等。不安全的原因主要包含以下三个方面:
- 通信使用明文,内容可能被窃听。
- 不验证通信方的身份,因此有可能遭到伪装。
- 无法验证报文的完整性,所以有可能被篡改。
对称加密:
对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密,常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
其加密过程如下:明文 + 加密算法 + 私钥 => 密文
解密过程如下: 密文 + 解密算法 + 私钥 => 明文
对称加密中用到的密钥叫做私钥,私钥表示个人私有的密钥,即该密钥不能被泄露。
其加密过程中的私钥与解密过程中用到的私钥是同一个密钥,这也是称加密之所以称之为“对称”的原因。由于对称加密的算法是公开的,所以一旦私钥被泄露,那么密文就很容易被破解,所以对称加密的缺点是密钥安全管理困难。
非对称加密:
非对称加密也叫做公钥加密。非对称加密与对称加密相比,其安全性更好。对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。用公钥或私钥中的任何一个进行加密,用另一个进行解密。
CA机构参与保证互联网安全
基本概念:
数字证书颁发机构(简称CA)是值得信赖的第三方实体颁发数字证书机构并管理为最终用户数据加密的公共密钥和证书。CA的责任是确保公司或用户收到有效的身份认证是唯一证书。
数字证书的原理:
数字证书采用公钥密码体制,即利用一对互相匹配的密钥进行加密、解密。每个用户拥有一把仅为本人所掌握的私有密钥(私钥),用它进行解密和签名;同时拥有一把公共密钥(公钥)并可以对外公开,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有相应的私钥,也无法进行解密。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。在公开密钥密码体制中,常用的一种是RSA体制。
CA证书简单介绍
CA是证书的签发机构,它是公钥基础设施(Public Key Infrastructure,PKI)的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。CA 拥有一个证书(内含公钥和私钥)。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。
证书安装
- 先使用域名申请证书
- 将证书放到/usr/local/nginx/conf目录中
- 修改nginx配置
server {
listen 9090;
server_name www.ease.center;
ssl_certificate xx.pem;
ssl_certificate_key xx.key;
}
笔记百度网盘链接自取:
链接:https://pan.baidu.com/s/19aAHZ-uVu9hRW884_MsRqw
提取码:vxk4
名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有相应的私钥,也无法进行解密。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。在公开密钥密码体制中,常用的一种是RSA体制。
CA证书简单介绍
CA是证书的签发机构,它是公钥基础设施(Public Key Infrastructure,PKI)的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。CA 拥有一个证书(内含公钥和私钥)。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。
证书安装
- 先使用域名申请证书
- 将证书放到/usr/local/nginx/conf目录中
- 修改nginx配置
server {
listen 9090;
server_name www.ease.center;
ssl_certificate xx.pem;
ssl_certificate_key xx.key;
}
笔记百度网盘链接自取:
链接:https://pan.baidu.com/s/19aAHZ-uVu9hRW884_MsRqw
提取码:vxk4