nginx安装以及启动

一、 简介

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器.

nginx可用于分布式部署,即把不同的ip:port 通过唯一的ip:port进行访问,

二、 安装编译工具及库文

yum -y install make zlib zlib-devel pcre-devel gcc-c++ libtool  openssl openssl-devel

三、Nginx安装

源码文件放在/home/resource/nginx

3.1 nginx-upstream-fair-master

官方github下载地址:https://github.com/gnosek/nginx-upstream-fair
说明:如果从github下载最新版本,在安装到nginx 1.14.0版本时,会报出编译错误。需要对源码做一些修改,修改参照(如果你看到这篇文章时,github主已经修改了该bug,或者你用的是nginx 1.14.0以下版本,请忽视...):https://github.com/gnosek/nginx-upstream-fair/pull/27/commits/ff979a48a0ccb9217437021b5eb9378448c2bd9e
对于比较懒的童鞋,这里提供了已经修改好的源码包:https://files.cnblogs.com/files/ztlsir/nginx-upstream-fair-master.zip

解压

[root@localhost nginx]# unzip nginx-upstream-fair-master.zip

3.2 nginx_upstream_check_module-master

下载地址:https://github.com/yaoweibin/nginx_upstream_check_module

解压

[root@localhost nginx]#unzip nginx-upstream-fair-master.zip

给 upstream-fair 扩展 upstream_check_module 的 upstream_fair.patch 补丁。否则,当负载均衡采用fair模式时,fair将会不支持check

[root@localhost nginx]# cd nginx-upstream-fair-master
[root@localhost nginx-upstream-fair-master]# patch -p1 < ../nginx_upstream_check_module-master/upstream_fair.patch

3.3 Nginx安装

下载地址:https://nginx.org/en/download.html

wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar -xvf nginx-1.14.0.tar.gz
cd nginx-1.14.0

给Nginx扩展 upstream_check_module 的 check_1.12.1+.patch 补丁。

[root@localhost nginx-1.14.0]# patch -p1 < ../nginx_upstream_check_module-master/check_1.12.1+.patch

编译设置

[root@localhost nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --add-module=/home/resources/nginx/nginx_upstream_check_module-master --add-module=/home/resources/nginx/nginx-upstream-fair-master

--prefix 为安装位置

安装

[root@localhost nginx-1.14.0]# make&make install

找不到openssl

checking for OpenSSL library ... not found
checking for OpenSSL library in /usr/local/ ... not found
checking for OpenSSL library in /usr/pkg/ ... not found
checking for OpenSSL library in /opt/local/ ... not found

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl= option.

原因分析:是因为编译新版本openssl时,库的位置没有和nginx编译配置的位置吻合,导致无法找到对应库文件造成编译错误! 解决方法

#vi /nginx解压目录/auto/lib/openssl/conf  修改库的路径为lib64
------------
74          if [ $NGX_RPATH = YES ]; then
75              ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib64 -lssl -lcrypto"
76          else
77              ngx_feature_libs="-L/usr/local/lib64 -lssl -lcrypto"

保存
然后重新编译nginx 即可


添加到环境变量

打开如下文件

vi /etc/profile

在文件末尾添加如下语句,并保存

#nginx configure
export NGINX_HOME=/usr/local/nginx
export PATH=$PATH:$NGINX_HOME/sbin

执行如下语句即可生效

source /etc/profile

输入如下语句,即可看到nginx版本信息

nginx -v

四、Nginx启动

进入目录/usr/local/nginx/sbin/nginx

或者在/usr/local/nginx也可以

或查看nginx安装地址

whereis nginx

4.1 启动:

nginx
nginx -c /path/nginx.conf        # 以特定目录下的配置文件启动nginx:

systemctl命令启动

systemctl start nginx.service

重启nginx服务

systemctl restart nginx.service

重新载入配置文件

nginx -s reload

查看端口号

netstat -tlnp

4.2 停止

从容停止服务 这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止。

nginx -s quit

立即停止服务 这种方法比较强硬,无论进程是否在工作,都直接停止进程。

nginx -s stop

systemctl 停止 systemctl属于Linux命令

systemctl stop nginx.service

killall 方法杀死进程 直接杀死进程,在上面无效的情况下使用,态度强硬,简单粗暴!

killall nginx

五、配置

5.1 配置文件

在/usr/local/nginx/conf/nginx.conf

检查配置文件是否正确

#检查指定的nginx配置文件是否正确
nginx -t -c /usr/local/nginx/conf/nginx.conf
# nginx -t 
#检查默认的nginx配置文件
/usr/local/nginx/sbin/nginx -t #-t就是检查是否配置正确
# 全局参数设置
user nginx;  #设置nginx使用的用户 默认nobody
worker_processes  4;          #设置nginx启动进程的数量,一般设置成与逻辑cpu数量相同 
error_log  logs/error.log;    #指定错误日志 
worker_rlimit_nofile 1024;  #设置一个nginx进程能打开的最大文件数 
pid        /var/run/nginx.pid; 
events { 
    worker_connections  1024; #设置一个进程的最大并发连接数 
}
# http 服务相关设置 
http { 
    include      mime.types; 
    default_type  application/octet-stream; 
    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; #是否调用sendfile函数输出文件,一般设置为on,若nginx是用来进行磁盘IO负载应用时,可以设置为off,降低系统负载 
    keepalive_timeout  65;   # 连接超时时间
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    gzip              on;      #是否开启gzip压缩,将注释去掉开启 
    keepalive_timeout  65;     #设置长连接的超时时间
    #负载均衡设置
    upstream cluster1 {
       #ip_hash; #让每个终端只访问固定后端
       #fair; 优先选择响应时间快的
       server 0.0.0.0:8101 weight=1;
       server 0.0.0.0:8102 weight=1;
    }    #设置需要连接的服务组,weight=1表示同等机会
# 虚拟服务器的相关设置 
    server { 
        listen      8100;        #设置监听的端口 
        server_name  192.168.46.230;        #设置绑定的主机名、域名或ip地址 
        charset koi8-r;        # 设置编码字符 
        location / { 
            root  html;           #设置服务器默认网站的根目录位置,需要手动创建
            index  index.html index.htm;    #设置默认打开的文档 
            proxy_pass http://cluster1;     # 这里是upstream的名称
            proxy_redirect off; # 设置后端服务器“Location”响应头和“Refresh”响应头的替换文本
            proxy_set_header X-Real-IP $remote_addr; # 获取用户的真实 IP 地址
            #后端的Web服务器可以通过 X-Forwarded-For 获取用户真实IP,多个 nginx 反代的情况下,例如 CDN。参见:http://gong1208.iteye.com/blog/1559835 和 http://bbs.linuxtone.org/thread-9050-1-1.html
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #以下是一些反向代理的配置,可选。
            proxy_set_header Host $host; # 允许重新定义或者添加发往后端服务器的请求头。
            client_max_body_size 10m; #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
            proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;
            #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            } 
        error_page  500 502 503 504  /50x.html; #设置错误信息返回页面 
        location = /50x.html { 
            root  html;        #这里的绝对位置是/usr/local/nginx/html
        } 
    } 

    # HTTPS server
    web服务器配置
    #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;
    #    }
    #}
 }

nginx.conf的组成:nginx.conf一共由三部分组成,分别为:全局块、events块、http块。在http块中又包含http全局块、多个server块。每个server块中又包含server全局块以及多个location块。在统一配置块中嵌套的配置快,各个之间不存在次序关系。

5.2 路径子目录不同跳转不同的地址或者不同的端口

location ~/edu/{
    proxy_pass http://127.0.0.1:8080;
}
location ~/vod{
    proxy_pass http://127.0.0.1:8081;
}
location ~/skj{
    proxy_pass http://192.168.46.230:8081;
}
location [ = | ~ | ~* | ^~ ] rui{
......
}

1\. =:要求字符串与uri严格匹配
2\. ~: 用于表示uri包含正则表达式,并且区分大小写
3\. ~*: 用于表示uri包含正则表达式,不区分大小写
4\. ^~: 用于不包含正则表达式的uri前,要求nginx服务器找到表示uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不在使用location块中的正则uri和请求字符串做匹配
注意: 如果uri包含正则表达式,则必须要有~ 或者~* 标识

5.3 分配服务器策略

  • 轮询:默认,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down调,能自动提出

  • weight: 权重, 默认为1,却终越高被分配的客户端越多

  • ip_hash: 每个请求按访问ip的hash结果分配,这样每个访问固定方位一个后端服务器(第三方插件)

  • fair: 按后端服务器的响应时间来分配请求,响应时间短的优先分配(第三方插件)

参考(https://www.jianshu.com/p/e64539590865)

5.4 动静分离

通过 location指定不同的后缀名实现请求转发。通过 指定不同的后缀名实现请求转发。通过 expires参数设置,可以使浏 参数设置,可以使浏 览器缓存过期时间,减少与服务之前的请求和流量。具体 览器缓存过期时间,减少与服务之前的请求和流量。具体 Expires定义:是给一个资源 设定一个过期时间,也就是说无需去 设定一个过期时间,也就是说无需去 服务端验证, 直接通过浏览器自身确认是否期即可服务端验证, 直接通过浏览器自身确认是否期即可所以不会产生额外的流量。此种方法非常适合经变动资源(如果更新文件, 所以不会产生额外的流量。不建议使用 Expires来缓存),我这里设置 来缓存),我这里设置 3d ,表示在这 ,表示在这 3 天之内访问这个 URLL,发送一 个请求,比对服务器该文件最后更新时间没有变化则不会从抓取返回状态码304, 如果有修改,则直接从服务器重新下载返回状态码 如果有修改,则直接从服务器重新下载返回状态码 200。

5.5 高可用

ngnix服务器分为一个主服务器和一个备份服务器

image-20210905163037680.png

安装keepalived,安装后位于/etc/keepalived

apt-get install keepalived -y
#yum install keepalived -y

修改/etc/keepalived/keepalived.conf配置文件

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL  #/etc/hosts
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script chk_http_port{ 
    script "usr/local/src/nginx_check.sh"  # 检测脚本地址
    interval 2  #检测脚本执行的间隔
    weight 2 #权重 
}
vrrp_instance VI_1 {
    state MASTER    # 备份服务器将MASTER改为BACKUP
    interface eth0   # ipconfig或者ifconfig 查询网卡名字
    virtual_router_id 51  # 主、备机的virtual_router_id必须相同
    priority 100  # 主、备机取不同的优先级,主机值较大
    advert_int 1 # 检测主备服务机是否或者的间隔
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16     # 虚拟地址
        192.168.200.17
        192.168.200.18
    }
}

在/usr/local/src添加检测脚本nginx_check.sh

#!/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: systemctl start keepalived.service

六、Docker中的Nginx

docker 下载nginx镜像

docker pull nginx

启动nginx

docker run --name nginx -p 80:80 -d nginx

修改nginx.conf

进入容器中:

docker exec -it nginx bash

nginx.conf配置文件在/etc/nginx/下面,由于镜像没有安装vim,先安装vim

apt-get update
apt-get install vim

修改后,重启即可

或进行挂载方式修改

docker run --name nginx \
-p 80:80 \
-v /home/docker-nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/docker-nginx/log:/var/log/nginx \
-v /home/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-d nginx

七、 原理

原理

master 与worker


image-20210905170118393.png
image-20210905170144476.png

一个master和多个worker的好处

  1. 可以使用nginx -s reload热部署,利用nginx进行热部署操作,即正在进行的worker还按原来的配置进行,闲置的按新配置进行

  2. 每个worker是独立的进程,如果有其中一个worker出现问题,其他worker独立的,继续进行争抢,实现请求过程,不会造成服务中断

设置多少worker合适?

worker数和服务器的cpu数相等是最适宜的

连接数worker_connection

发送一个请求,占用worker的2个或者4个连接数

最大并发数

普通的静态访问最大并发数: wokers * worker_process/2

如果是http作为反向代理来说,最大并发数: worker*worker_process/4

参考1(https://www.cnblogs.com/skynet/p/4146083.html)

参考2(https://www.runoob.com/linux/nginx-install-setup.html)

[参考3]https://www.jianshu.com/p/5248366dfa88

参考4(https://zhuanlan.zhihu.com/p/112680766) Nginx之upstream的四种配置方式

你可能感兴趣的:(nginx安装以及启动)