Nginx简介
Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强,事实上nginx的并发能力在同类型的网页代理服务器中表现较好
Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数
-
反向代理:客户端感知不到代理的存在
- 正向代理:在客户端配置代理服务器,通过代理服务器进行互联网访问
负载均衡
动静分离
安装
yum install -y nginx
默认网站目录:/usr/share/nginx/html
默认配置文件:/etc/nginx/nginx.conf
自定义配置文件目录:/etc/nginx/conf.d/
nginx常用命令
进入/usr/sbin目录
- 查看版本 ./nginx -v 或者nginx -v 后面同理
-
启动 ./nginx
- nginx -c /etc/nginx/nginx.conf 指定配置文件启动
-
停止
./nginx -s stop(强制)
./nginx -s quit(普通)
重新加载(更改了配置文件但不想重新启动) ./nginx -s reload
nginx -t 查看配置文件
遇到问题:
或者 -p表示显示进程
kill掉再启动
systemctl
# 启动
systemctl start nginx
# 停止
systemctl stop nginx
# 重启
systemctl restart nginx
# 查看状态
systemctl status nginx
# 开机启动
systemctl enable nginx
# 禁用开机启动
systemctl disable nginx</pre>
配置文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
1.全局块
从配置文件开始到events块之间的内容,主要设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、运行生成的worker process数,进程pid存放路径、日志存放路径和类型以及配置文件的引入等
比如:worker_processes 1;
这是Nginx服务器并发处理的关键配置,worker_processes值越大,可以支持的并发处理也越多,但是会受到硬件、软件等设备的影响
2.events块
events块设计的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多worker_processes下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件模型来处理连接请求,每个worker_processes可以同时支持的最大连接数等
这部分的配置对Nginx的性能影响较大,在实际中应该灵活配置
3.http块
这个Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里
http全局块:配置文件导入、MIME-TYPE定义、日志自定义、连接超时时间、单连接请求上限等
-
server块:这块和虚拟直接有密切关系,每个http块可以包括多个server块,每个server块就相当于一个虚拟主机,每个server块可分为全局server块和多个location块
全局server块:最常见的配置是本虚拟主机的监听配置和本虚拟直接的名称或IP配置
location块:主要作用是基于Nginx服务器接收到的请求字符串(如server_name/uri),对虚拟主机名称(或IP)之外的字符串(uri)进行配置,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能,还有许多第三方的模块也在这里配置
配置反向代理
修改nginx.conf
server {
server_name 140.143.139.179;#修改为linux的ip
location / {
proxy_pass http://127.0.0.1:8080;#tomcat的8080
}
}
nginx -s reload
在浏览器访问140.143.139.179就可以看到tomcat的页面了
实例二
实现效果:Nginx监听9001
访问 /9001/edu/ 跳转到tomcat的8080
访问 /900/vod/ 跳转到tomcat的8081
再准备一个8081的tomcat
修改server.xml,改端口号,记得开放防火墙
在两个tomcat的webapps下分别建 edu vod目录
如
cd /usr/local/soft/tomcat/tomcat8080/webapps
mkdir edu
cd edu
echo '<h1>8081</h1>' > a.html</pre>
修改nginx配置文件
server {
listen 9001;
server_name 140.143.139.179;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
浏览器输入http://140.143.139.179:9001/edu/a.html
http://140.143.139.179:9001/vod/a.html
就能看到效果啦
对location语法说明的说明:
= :用于不含正则表达式,严格匹配
/ :以/开头,所以可以匹配到所有请求
/edu/:以/edu/开头
~ :含正则表达式,区分大小写
~*:含正则表达式,不区分大小写
^~ :用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,停止向下搜索
配置负载均衡
两个tomcat 都建edu/a.html
修改nginx配置文件
# 写在http块中
upstream myserver{
server 140.143.139.179:8080;
server 140.143.139.179:8081;
}
server {
listen 80;
server_name 140.143.139.179;
location / {
proxy_pass http://myserver;
}
}
nginx提供的负载均衡的策略:
轮询(默认),如果服务器down了,能自动删除
weight:默认权重为1,权重越高被分配的客户端越多
upstream myserver{
server 140.143.139.179:8080 weight=10;
server 140.143.139.179:8081 weight=10;
}
- ip_hash:根据ip的hash结果分配,每个客户端固定一个服务器,可以解决session问题
upstream myserver{
ip_hash;
server 140.143.139.179:8080;
server 140.143.139.179:8081;
}
- fair:根据后端服务器的响应时间来分配请求,响应时间段的优先分配
upstream myserver{
server 140.143.139.179:8080;
server 140.143.139.179:8081;
fair;
}
配置动静分离
通过location指定不同的后缀名实现不同的请求转发,通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。具体expires定义:给一个资源设定一个过期时间,也就是无需服务器去验证,之间通过浏览器却是否过期即可,所以不会产生额外的流量。次方法适用于不经常变动的资源,如设置为3d,表示3天之内访问这个url,发送一个请求,比对服务器该文件最后更新时间没有变化,返回304,如果有修改,则需要从服务器重新下载,返回200
准备工作:
建立 /home/data/images/bg.bmp /home/data/www/index.html
修改配置文件
server {
listen 80;
server_name 140.143.139.179;
location /www/ {
root /home/data;
}
location /images/ {
root /home/data;
autoindex on; # 显示目录
}
}
浏览器访问http://140.143.139.179/www/index.html
http://140.143.139.179/images/bg.bmp
会下载图片
配置高可用
准备两个虚拟机 192.168.119.129
192.168.119.130
都安装keepalived yum install keepalived -y
配置文件/etc/keepalived/keepalived.conf
/etc/hosts加入127.0.0.1 LVS_DEVEL
修改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.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL # hosts 访问到主机
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port {
srcipt "/usr/local/src/nginx_check.sh"
interval 2 # 检测脚本执行的间隔
weight 2 # 脚本中条件成立,主机权重增加2
}
vrrp_instance VI_1 {
state MASTER # 主机 MASTER 从机 BACKUP
interface ens33 # 绑定的网卡
virtual_router_id 51 # 主从机要相同
priority 100 #值越大,优先级越高,主机较大,从机较小
advert_int 1 #每隔1s发送心跳
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.119.50 # 绑定的虚拟ip
}
}
检测脚本
# !/bin/bash
A=`ps -C nginx -no-header |wc -1`
if [ $A -eq 0 ]; then
/usr/sbin/nginx #nginx启动的位置
sleep 2
if [ `ps -C nginx --no-header |wc -1` -eq 0 ];then
killall keepalived
fi
fi
启动两个虚拟机的nginx和keepalived
浏览器访问192.168.119.50
可以看到结果
停掉主机的keepalived和nginx仍然可以看到结果
nginx原理
worker如何工作:争抢
[图片上传失败...(image-122c41-1588657842215)]
配置文件
worker_processes auto;
events {
worker_connections 1024;
}
一个master多个worker好处:
可以使用nginx -s reload热部署
对于每个worker来说,都是独立的进程,不需要加锁,所以省掉了锁带来的开销
一个进程退出后,其它进程还在工作,服务不会中断,master很快启动新的worker进程
设置多少个worker合适:
nginx同redis一样采用io多路复用,每个worker都是一个独立的进程,但每个进程只有一个线程,通过异步非阻塞的方式来处理请求,即使是千万个请求也不再话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和cpu的数量相等是最为适宜的,设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗
连接数worker_connections:
- 发送一个请求,占用worker2个(静态资源)或4个(HTTP反向代理)连接数