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端口

http://192.168.137.129

访问如下安装成功。

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、准备工作

安装两台服务器,且都要安装 Nginxkeepalived

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

启动测试即可

posted @ 2021-05-19 15:12  橘子有点甜  阅读(115)  评论(0编辑  收藏  举报