Nginx
Nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
为什么使用:Nginx
随着互联网的发展,入驻互联网的用户越来越多,多个用户同时访问一个web服务器时,服务器能耗不够支持工作,那么我们就需要添加服务器来供用户访问,但是我们添加了服务器这样用户访问的IP就会变得不一样,但是我们一个公司就只能是一个访问地址。这时候就需要我们使用 Nginx
来解决该问题。
Nginx
的主要功能如下:
-
正向代理(请求到代理服务器 --> 代理服务器找到要访问的服务器)
-
反向代理
-
负载均衡
多个用户访问服务器是应该将它们
如何分配
给不同的服务器,主要有轮询
、加权轮询
、Ip hash
轮询
:每台服务器一次接收一个用户请求加权轮询
:通过权重给不同的服务器接收的请求数量不同Ip Hash
:通过服务器第一次访问的IP地址进行分配,以后访问都会走这台服务器,可以用于存放Session
-
动静分离
安装Nginx
1、下载 点击下载Nginx 1.20.0版本
2、将下载的文件上传到Linux系统
3、准备运行环境(环境有的可以忽略)
-
安装
gcc
yum install gcc-c++
-
安装正则表达式解析器
pcre
yum install -y pcre pcre-devel
-
安装
gzip
yum install -y zlib zlib-devel
-
安装
openssl
yum install -y openssl openssl-devel
4、解压上传的压缩包
tar -xzvf nginx-1.20.0.tar.gz
5、进入解压目录并安装
# 进入安装目录
cd nginx-1.20.0/
# 执行安装
./configure
make
make install
6、进入启动目录启动程序
# 进入启动目录
cd /usr/local/nginx/sbin/
# 启动程序 如果启动失败请检查80端口是否被占用
./nginx
7、查看IP地址并打开防火墙
# 查看ip centos版本用 ip addr
ip addr
# Nginx 默认使用80端口,所以需要开发80端口
#####################################
# 以下是centos 关于防火墙的常用命令
# 开启防火墙
[root@localhost home]# systemctl start firewalld.service
# 设置开机自动开启防火墙
[root@localhost home]# systemctl enable firewalld.service
# 查看防火墙状态
[root@localhost home]# firewall-cmd --state
running
# 开启防火墙端口 80端口
[root@localhost home]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
# 重启防火墙
[root@localhost home]# systemctl restart firewalld.service
# 关闭防火墙端口
firewall-cmd --permanent --zone=public --remove-port=80/tcp
# 查看已开启端口
firewall-cmd --list-ports
8、在本地访问查看结果
IP 是之前配置linux系统的ip 默认是80端口 http协议默认走80端口
访问如下安装成功。
Nginx常用命令使用
./nginx # 启动
./nginx -s stop # 停止
./nginx -s quit # 安全退出
./nginx -s reload # 重新加载配置文件
./nginx -c filename # 指定配置文件
Nginx配置文件详解
注意配置文件路径是在 /usr/local/nginx/conf/nginx.conf
#配置用户或者组,默认为nobody nobody。
#user nobody;
#允许生成的进程数,默认为1
worker_processes 1;
#制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别依次为debug|info|notice|warn|error|crit|alert|emerg
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#指定nginx进程运行文件存放地址
#pid logs/nginx.pid;
events {
#最大连接数,默认为512
worker_connections 1024;
# 以下为自己选择配置
# accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
# multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
# use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
}
http {
# 文件扩展名与文件类型映射表
include mime.types;
# 默认文件类型,默认为text/plain
default_type application/octet-stream;
# 取消服务日志
#access_log off;
# 自定义格式
#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方式传输文件,默认为off,可以在http块,server块,location块。
sendfile on;
#tcp_nopush on;
#每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
# sendfile_max_chunk 100k;
#连接超时时间,默认为75s,可以在http,server,location块。
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 用于设置Nginx集群的主机地址 mysvr 是一个自定义名字 备用需要使用 backup 标注
# upstream mysvr {
# 设置需要转向的地址路径 后面可以加参数,代表对多台服务器的访问规则
# server 127.0.0.1:7878;
# server 192.168.10.121:3333 backup;
# }
#错误页,配置访问404后跳转的网页
# error_page 404 https://www.baidu.com;
server {
# 监听端口
listen 80;
# 监听地址
server_name localhost;
# 单连接请求上限次数。
keepalive_requests 120;
#charset koi8-r;
# 日志输出
#access_log logs/host.access.log main;
#请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
location / {
# 根目录
root html;
#请求转向mysvr(对应上面自定义的映射路径) 定义的服务器列表
proxy_pass http://mysvr;
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 下的安全连接在此配置
# 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;
# }
#}
}
正向代理配置
反向代理配置
1、单一代理
# 配置 http块下的 server 块
server {
# 配置要监听的位置,也就是浏览器直接访问的地址加端口号
listen 80;
server_name 192.168.137.129;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
# 配置要代理的服务器
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
2、
正则表达式使用
# 在localhost 后面配置,可以解析一些访问路径的表达式
# 访问路径包含 v1的走 127.0.0.1:7878
# 访问路径包含 v2的走 192.168.10.121:3333
localhost ~ /v1/ {
server 127.0.0.1:7878;
}
localhost ~ /v2/ {
server 192.168.10.121:3333;
}
负载均衡配置
负载均衡的前提是需要转发到多台服务器
# 首先在 server 块上面添加如下配置 mysvr名字不固定,只需要在后面名字相同即可
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
# 轮询方式配置,默认也是轮询,可以不用加
# server 127.0.0.1:7878 weight = 1;
# server 192.168.10.121:3333 weight = 1;
# 加权轮询方式配置,
# server 127.0.0.1:7878 weight = 2;
# server 192.168.10.121:3333 weight = 1;
# Ip Hash方式配置
# ip_hash
# server 127.0.0.1:7878 1;
# server 192.168.10.121:3333 1;
}
# 配置 http块下的 server 块
server {
# 配置要监听的位置,也就是浏览器直接访问的地址加端口号
listen 80;
server_name 192.168.137.129;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
# 配置要代理的服务器
#请求转向mysvr(对应上面自定义的映射路径) 定义的服务器列表,名字和上面一样
proxy_pass http://mysvr;
index index.html index.htm;
}
动静分离配置
# 使用 Nginx 实现动静分离
localhost /www/ {
# 代表操作系统更目录下面的data
root /data/
index index.html index.htm;
# 访问路径 http://监听路径/www/文件名
}
localhost /image/ {
# 代表操作系统更目录下面的data
root /data/
# 列出资源所在目录的列表,类似于很多的镜像站
autoindex on;
#访问路径: http://监听路径/image/文件名
}
高可用的 Nginx
因为服务器的原因,一般情况下如果只有一台服务器配置了Nginx
那么当这条服务器宕机时,我们的所有网页将不能使用,所以对应 Nginx
一般情况下,我们需要集群配置。以此形成高可用的Nginx
原理图:
1、准备工作
安装两台服务器,且都要安装 Nginx
、keepalived
keepalived:是用于Nginx
集群的一个软件
# 安装命令
yum install keepalived
2、keepalived 常用命令
systemctl start keepalived.service
systemctl stop keepalived.service
systemctl restart keepalived.service
tail -f /var/log/messages # 查看日志
3、配置配置文件(主从配置)
编辑 keepalived
的配置文件
# 进入配置文件目录
cd /etc/keepalived/
# 编辑配置文件
vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { # keepalived服务宕机异常出现的时候,发送通知邮件 可以是多个
acassen@firewall.loc # 收件人邮箱1
failover@firewall.loc # 收件人邮箱2
sysadmin@firewall.loc # 收件人邮箱3
}
notification_email_from Alexandre.Cassen@firewall.loc #邮件发件人
smtp_server 192.168.200.1 # 邮件服务器地址
smtp_connect_timeout 30 # 超时时间
router_id LVS_DEVEL # 机器标识 局域网内唯一即可
vrrp_skip_check_adv_addr # 默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。
#vrrp_strict # 严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址。
vrrp_garp_interval 0 # 小数类型,单位秒,在一个网卡上每组gratuitous arp消息之间的延迟时间,默认为0,一个发送的消息=n组 arp报文
vrrp_gna_interval 0 # 小数类型,单位秒, 在一个网卡上每组na消息之间的延迟时间,默认为0
}
# 检测 nginx 的活动状态
vrrp_script chk_http_port{
# 检测脚本路径
script "/etc/keepalived/nginx_chech.sh"
interval 2
weight 2
}
# vrrp实例 我们集群设置 多机配置,除了state和priority不一样,其他都一样
vrrp_instance VI_1 {
state MASTER # 服务器状态 MASTER是主服务器 BACKUP是备份服务器 主服务器的priority要比备份服务器大
interface ens33 # 通信端口 通过ip addr可以看到 根据自己的机器配置
virtual_router_id 51 # vrrp实例id keepalived集群,实例id必须一致
priority 100 # 权重比 主服务器的priority要比备份服务器大
advert_int 1 # 心跳间隔 单位秒 keepalived多机器集群 通过心跳检测,如果发送心跳没反应 就立刻接管;
authentication { # 服务器之间通信密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 自定义虚拟IP
192.168.137.80
}
}
3、检测脚本配置
#!/bin/bash
A=`ps -C nginx -no-header | wc -l`
if [$A -eq 0 ];then
/usr/local/neginx/sbin/nginx
sleep 2
if [`PS -C nginx --no-header |wc -1` -eq 0 ]; then
killall keepalived
fi
fi
启动测试即可