安装好 Nginx 后需要设置防火墙开放对应端口
# 列出所开通的端口
$ firewall-cmd --list-all
# 添加端口
$ firewall-cmd --add-service=http -permanent
$ sudo firewall-cmd --add-port=80/tcp --permanent
# 设置成功后需要重启防火墙生效
$ firewall-cmd --reload
Nginx 常用操作命令
如果没有配置环境变量需要进入到 nginx 的安装目录下进行操作
安装目录为 “/usr/local/nginx/sbin”(其他的有可能不一样)
操作命令 | 说明 |
nginx -v | 查看 Nginx 版本号(小写 “v” 只显示版本号,大写 “V” 显示详细信息及配置参数的说明) |
nginx | 启动 Nginx |
nginx -s stop | 关闭 Nginx("-s" 表示向主进程发送一个信号,可以是 stop、quit、reopen、reload) |
nginx -s reload | 重新加载 Nginx |
Nginx 配置文件的组成
- 全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 Nginx 服务器整体运行的配置指令
比如:worker_processes 1; worker_processes 值越大,可以支持的并发处理量也越多 - events 块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接
比如:worker_connections 1024; 支持的最大连接数 - http 块
算是 Nginx 服务器配置中最频繁的部分
http 块中包含 http 全局块和 server 块
Nginx 配置实例 - 反向代理
location 指令说明
该指令用于匹配 URL。
指令 | 描述 |
= | 用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。 |
~ | 用于表示 uri 包含正则表达式,并且区分大小写。 |
~* | 用于表示 uri 包含正则表达式,并且不区分大小写。 |
^~ | 用于不包含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。 |
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
Nginx 配置实例-负载均衡
Step 1:在 http 块中新建 upstream server
负载均衡分配策略
- 轮询(默认)
每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,将会自动剔除。例如:
http {
upstream myserver {
server xxx.xxx.xxx.xxx:8080;
server xxx.xxx.xxx.xxx:8081;
......
}
}
- 权重(weight)
权重默认为 1,权重越高被分配的客户端越多
*指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。*例如:
http {
upstream myserver {
server xxx.xxx.xxx.xxx:8080 weight=10;
server xxx.xxx.xxx.xxx:8081 weight=10;
......
}
}
- ip_hash
每个请求按照访问 ip 的 hash 结果分配,这样每个请求固定一个后端服务器,可以解决 Session 的问题。例如:
http {
upstream myserver {
ip_hash;
server xxx.xxx.xxx.xxx:8080;
server xxx.xxx.xxx.xxx:8081;
}
}
- fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
http {
upstream myserver {
server xxx.xxx.xxx.xxx:8080;
server xxx.xxx.xxx.xxx:8081;
fair;
}
}
Step 2:在 server 块中的 location 块中配置一下内容,引用 upstream myserver
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
Nginx 配置实例-动静分离
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在-起发布,通过nginx 来分开。
通过location指定不同的后缀名实现不同的请求转发通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。( 如果经常更新的文件,不建议使用 expires 来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
location /pages/ {
root static;
index page1.html; #默认首页
}
location /images/ {
root static;
autoindex on; # 列出文件加中所有的内容
}
Nginx 配置实例-高可用服务器集群
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M0DHHjJa-1587277385731)(D:\Learn\笔记\Nginx-img\20200307111238.jpg)]
- 配置高可用的准备工作
- 需要两台服务器
- 在两台服务器上安装 nginx
- 在两台服务器上安装 keepalived
- 在两台服务器上安装 keepalived
使用 yum 命令进行安装
$ yum install keepalived -y
查看是否安装成功
$ rpm -q -a keepalived
keepalived 安装目录为:/etc/keepalived
配置文件目录在:/etc/keepalived/keepalived.conf
- 完成高可用配置(主从配置)
- 修改
/etc/keepalived/keepalived.conf
配置文件
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL # 访问到的主机 在 HOSTS 文件中配置
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)单位:秒
weight 2 # 权重
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡 执行 ipconfig 查看
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 发送心跳检测进程是否存活(单位:秒)
authentication { #认证方式
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 虚拟 IP
192.168.17.50 // VRRP H 虚拟地址
}
}
- 在
/usr/local/src
添加建测脚本
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
- 启动两台服务上的 Nginx 和 Keepalived
启动 Nginx:./nginx
启动 Keepalived:keepalived:systemctl start keepalived.service
Nginx 原理与优化参数配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zXWc5FBw-1587277385736)(D:\Learn\笔记\Nginx-img\20200307133255.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ss8gHXi-1587277385738)(D:\Learn\笔记\Nginx-img\20200307133332.jpg)]
master-workers 的机制的好处
首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,
同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会
影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的
worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当
前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
需要设置多少个 worker
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进
程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话
下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu
数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
io 多路复用机制 在 Windows 上不起作用
设置 worker 数量。
worker_processes 4
# work 绑定 cpu(4 work 绑定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
# work 绑定 cpu (4 work 绑定 8cpu 中的 4 个) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000
连接数 worker_connection
这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接
数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数,对于
HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections *
worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访
问最大并发数是: worker_connections * worker_processes /2,而如果是 HTTP 作 为反向代
理来说,最大并发数量应该是 worker_connections *
worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服
务的连接,会占用两个连接。