Nginx实战(基础篇)
一、Nginx 简介
1.1 Nginx的几种发行版
Nginx常用的有如下四种版本:
- Nginx开源版,该版本比较纯净,但不适合做二开
- Nginx pro商业版
- Tengine 淘宝内部使用的Nginx,一般项目可以使用该版本的Nginx
- OpenResty(Nginx+Lua),如果需要对Nginx进行扩展,可优先选择这个,支持使用Lua脚本对Nginx进行功能扩展
1.2 安装Nginx
从nginx: download下载Nginx,也可以使用如下命令下载:
wget https://nginx.org/download/nginx-1.24.0.tar.gz
然后,解压:
tar -zxvf file.tar.gz
检查环境和配置:
./configuration --prefix=/usr/local/nginx
# 这里prefix的含义是指定nginx的安装目录
进行编译和安装:
make & make install
1.3 将Nginx安装为系统服务
创建服务脚本
vi /usr/lib/systemd/system/nginx.service
服务脚本内容
[Unit]
Description=nginx
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
来启动nginx服务。
二、Nginx基础配置
2.1 虚拟主机 vhost
可以利用虚拟主机在一台Nginx服务器上配置多个站点,充分发挥服务器性能。
Nginx中配置虚拟主机主要利用server来实现,如下所示:
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;
location = /50x.html {
root html;
}
}
server {
listen 8080;
server_name localhost;
location / {
root /www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置虚拟主机的原则是 server_name + port 必须是唯一的,server_name 也可以使用域名来进行配置,如下所示:
http {
...
server {
listen 80;
server_name zolmk.tech;
...
}
server {
listen 80;
server_name vod.zolmk.tech;
...
}
}
2.2 server_name 的多种匹配方式
http.server 标签中的 server_name有多种匹配方式可以使用,它们分别是:
- 全限定域名或IP:即使用完整名称进行匹配
- 通配符匹配:即使用 * 进行匹配
- 正则匹配:即使用正则表达式进行匹配
正则表达式匹配示例:
http {
...
server {
listen 80;
server_name zolmk.tech;
...
}
server {
listen 80;
server_name ~^[0-9]*\.vod\.zolmk\.tech$;
...
}
}
在 nginx 中,location 和 server_name 等使用正则表达式进行匹配时,必须在正则表达式前面加~
,以表示后面的内容为正则表达式。
2.3 反向代理和正向代理
正向代理:一般指内网用户通过正向代理来访问外网,代理网关是内网和外网连接的桥梁。
反向代理:与正向代理不同的是代理网关充当的角色,在反向代理中,代理网关的作用是隐藏内部服务细节,向用户提供统一的接口,代理网关起到中转请求的作用。
Nginx中,可以通过如下方式配置正向代理:
server {
...
# 配置dns服务器
resolver 8.8.8.8;
location / {
# $scheme表示协议类型
proxy_pass $scheme://$host$request_uri;
...
}
}
Nginx中,可通过如下方式配置反向代理:
upstream httpds {
server 192.168.1.110;
server 192.168.1.112;
}
server {
...
location / {
proxy_pass http://httpds;
}
}
这里起作用的主要是 proxy_pass 和 upstream 关键字,在 server.location 里面的 proxy_pass 表示该 location 路径下使用代理模式, 它的值 http://+别名 ,这里的别名和 upstream 后面紧跟的别名一一对应,upstream 关键字用来指定一组相同的服务。
2.4 负载均衡
Nginx 支持的负载均衡主要有:轮询、权重、最少连接数、uri哈希、ip哈希。通常我们会使用轮询和权重的方式来进行负载均衡。
轮询方式:
upstream httpds {
server 192.168.1.110;
server 192.168.1.112;
}
server {
...
location / {
proxy_pass http://httpds;
}
}
权重方式:
upstream httpds {
server 192.168.1.110 weight=8;
server 192.168.1.112 weight=2;
}
server {
...
location / {
proxy_pass http://httpds;
}
}
ip哈希:
upstream httpds {
ip_hash;
server 192.168.1.110;
server 192.168.1.112;
}
uri哈希:
upstream httpds {
hash $request_uri;
server 192.168.1.110;
server 192.168.1.112;
}
cookie值哈希:
upstream httpds {
hash $cookie_jssessionid;
server 192.168.1.110;
server 192.168.1.112;
}
上述cookie值哈希需要确保cookie中包含jssessionid字段。
在 upstream.server 中还有几个关键字可以配置,分别是 down 和 backup,down 表示该服务不可用,backup 表示仅当其他资源都不可用时,再使用该资源;当其他资源可用时,不会使用它。
upstream httpds {
server 192.168.1.110 weight=8 down;
server 192.168.1.112 weight=2;
server 192.168.1.112 weight=2 backup;
}
server {
...
location / {
proxy_pass http://httpds;
}
}
2.5 动静分离
动静分离中的“动”和“静”分别指动态资源和静态资源,动静分离指将服务中的静态资源存放在Nginx所在的服务器,当客户端请求静态资源时,Nginx直接返回给用户,加速了静态资源的传输效率。
动静分离一般是通过 server.location 进行配置,示例如下:
server {
...
location ~*/(css|js|img) {
root html;
}
}
location后的值中,'~'后面的星号表示忽略大小写。上述配置使用了正则表达式来匹配 /css /js /img 路径。
2.6 URL rewrite
url重写在一些想要隐藏敏感路径的情况下非常有用,它需要配合正则表达式来使用,示例如下:
location / {
...
rewrite ^/(.*).(htm|html|txt)$ /$1.$2 break;
}
rewrite的格式为 rewrite 需要重写的url 重写后的url
,用括号来进行分组,通过$数字来获取分组。
2.7 防盗链
防盗链可以防止服务器内部的静态资源被随意在其他地方使用,它是通过http请求头中的referer属性来实现的,当浏览器在发出请求的时候,如果该请求是通过页面链接引起的,那么浏览器会在请求头中加入referer,它的值为当前页面的根url,Nginx服务器可以通过配置来验证referer的值是否符合预期,如果不符合,则返回自定义内容,如果符合,返回预期内容。
防盗链配置规则:
valid_referers none | blocked | server_names | strings ...
- none:用来处理referer为空的情况
- blocked:检测referer被防火墙或代理服务器删除或伪装的情况
- server_names:可以配置多个server_name进行验证
Nginx配置示例如下:
location ~*/(css|js|img) {
valid_referers www.zolmk.tech zolmk.tech;
if ($invalid_referer){
return 403;
}
root html;
}�
这里验证无效的referer后,不仅可以返回错误码,还可以使用url rewrite技术,返回指定的内容。
location ~*/(css|js|img) {
valid_referers www.zolmk.tech zolmk.tech;
if ($invalid_referer){
rewrite ^/ /img/x.png break;
}
root html;
}�
上面的配置将所有的未通过验证的referer的url进行了重写,将返回 /img/x.png 的内容。
2.8 Nginx 高可用——keepalived
微服务通过集群的方式部署和使用Nginx进行负载均衡配置实现了服务的高可用,假如Nginx代理服务器挂掉,用户无法访问被代理的微服务,此时服务就变为不可用状态。
为了实现Nginx高可用,需要引入一个keepalived程序,它的功能和它的名字一样,就是用来检测服务是否存活的,具有相同配置的不同主机上的keepalived程序称为一个组,keepalived程序管理着一个虚拟IP(vip),组内同一时刻仅有一台主机可持有该vip。也就是说,具有相同配置的keepalived之间相互通信,当keepalived程序检测到持有vip的主机挂掉后,它将从存活的主机中选择一台来将vip添加到该主机的网卡上。持有vip的主机对外提供服务。
1. 安装 keepalived
- centos可用通过命令
yum install keepalived
进行安装,配置文件地址为/etc/keepalived/keepalived.conf
- 从Keepalived for Linux下载编译安装,安装方式和安装Nginx类似
2. 配置 keepalived
最小的 keepalived 配置如下:
! Configuration File for keepalived
global_defs {
! 路由id,同一组需配置相同
router_id LB_111
}
vrrp_instance VI_1 {
! state=MASTER | BACKUP 如果为MASTER,则表示为主节点,如果为BACKUP,则表示备用节点
state MASTER
! 这里填写网卡名称,可以通过 ip addr 命令获取
interface enp0s3
! 虚拟路由id,同一组需配置相同
virtual_router_id 51
! 当前节点获得vip的优先级,优先级越高,获得vip的概率越大
priority 100
! 检测时间间隔,多久检测一次主节点是否存活
advert_int 1
! 鉴权信息,同一组需配置相同
authentication {
auth_type PASS
auth_pass 1111
}
! 虚拟的ip地址,该地址由keepalived管理
virtual_ipaddress {
192.168.1.111
}
}�
最少配置两台机器作为Nginx网关服务器,一台做master,一台做backup,配置keepalived后,当主节点挂掉后,keepalived会自动将虚拟ip加入到备用节点的网卡上,类似于IP漂移。
2.9 http + ssl
首先假设我们已经通过阿里云等平台申请到了Nginx可以使用的证书、私钥文件(xx.pem、xx.key),在Nginx中配置https非常简单,示例如下:
server {
listen 443 ssl;
server_name localhost;
ssl_certificate xx.pem;
ssl_certificate_key xx.key;
...
}
server{
listen 80;
server_name localhost;
return 301 https://$server_name$request_uri;
}�
上面配置ssl时使用了相对路径,所以需要将xx.pem和xx.key放入nginx/conf文件夹中。上述配置将http请求转换为https请求。