Nginx环境搭建和配置

Nginx安装配置

Nginx也是一款服务器,我们常用它做如:反向代理、负载均衡、动态与静态资源的分离的工作,这里就不过多介绍了,这篇博客介绍的十分详细:Nginx相关介绍
跨平台、配置简单,非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发
Nginx优点
1、高并发连接
2、内存消耗少
3、配置文件非常简单
4、成本低廉
5、支持Rewrite重写规则
6、内置的健康检查功能
7、节省带宽
8、稳定性高

Nginx支持热部署,几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。能够在不间断服务的情况下,对软件版本进行进行升级。Nginx的配置文件非常简单,风格跟程序一样通俗易懂,能够支持perl语法。使用nginx –s reload可以在运行时加载配置文件,便于运行时扩容/减容。重新加载配置时,master进程发送命令给当前正在运行的worker进程worker进程接到命令后会在处理完当前任务后退出。同时,master进程会启动新的worker进程来接管工作。

我这里系统是centos,如果是其他系统命令会有些不同,流程是一样的,当然用docker直接pull镜像是很方便的,该配置就有些不同

1、在线安装
yum install nginx

安装好的文件位置如下:
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志

通过这种方式安装的,会自动创建服务,会自动在/etc/init.d/nginx新建服务脚本,然后就可以使用如下命令进行操作:
service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}

如果你想改它的配置文件地方,那么就还是本地解压安装吧

  1. 离线安装
    注1:官网的步骤是通过命令行配置Nginx文件,将 openssl、pcre、zlib 一起编译安装的,但是这样一旦出错,不容易解决,所以最好单独编译安装
    注2:因为后面使用第三方扩展模块ngx_cache_purge,必须使用nginx的安装源文件,而离线方式是不存在的,只有deb文件

         # 一、安装nginx所需依赖库   
         # 安装gcc g++的依赖库    
           yum install build-essential  
       
           yum install libtool
         # 安装pcre依赖库
           yum install libpcre3 libpcre3-dev
         # 安装zlib依赖库
           yum install zlib1g-dev
         # 安装SSL依赖库(16.04默认已经安装了,有些版本的linux是没有安装)
           yum install openssl
             
         # 二、下载并解压安装包
         # 官方下载页面:http://nginx.org/en/download.html
         # configure配置文件详解:http://nginx.org/en/docs/configure.html
         # wget http://nginx.org/download/nginx-1.14.2.tar.gz             
         cd /usr/local/mytools
         # 上传并解压离线安装包
         pscp d:/temp/nginx-1.14.2.tar.gz [email protected]:/usr/local/mytools
         tar -zxvf nginx-1.14.2.tar.gz
    
         # 三、安装Nginx
         # 进入解压目录
         cd nginx-1.14.2
         # 配置:--prefix指定nginx的安装路径
         ./configure --prefix=/usr/local/nginx  
         # 编译:
         make
         # 安装
         make install
         注1:安装好的文件位置如下:
              /usr/local/nginx/sbin/nginx:主程序
              /usr/local/nginx/conf/nginx.conf:存放主配置文件
              /usr/local/nginx/html:存放静态文件
              /usr/local/nginx/logs:存放日志
         # 启动:
         /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf                
         注1:-c 指定配置文件的路径,不加的话,nginx会自动加载默认路径的配置文件。
         注2:启动成功后可将浏览器输入http://服务器IP:80/即可看到nginx欢迎页面     
         
         #查看进程:
         ps -ef | grep nginx 
    
         # 四、创建Nginx自动启动脚本
         cd /etc/init.d                 # 进入/etc/init.d目录
         touch nginx                    # 创建脚本文件nginx,将资料“nginx配置方案及启动脚本/nginx”文件中的内容复制进来
         chmod a+x nginx                # a+x 是给所有人加上可执行权限,包括所有者,所属组,和其他人
        chkconfig --add nginx
     	chkconfig nginx on
         
         # 常用的命令如下
         service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}  
    

至于启动配置文件,长了,自己去百度了,这里就不发了

如果你配置不了自动启动脚本,那么就用原生态的就好了

开启
/usr/local/nginx/sbin/nginx

重启:
/usr/local/nginx/sbin/nginx -s reload

停止:
/usr/local/nginx/sbin/nginx -s stop

测试配置文件是否正常,这行命令是非常重要的,配置出错就靠它来排查:
/usr/local/nginx/sbin/nginx -t

在下载环境的时候可能会报错,如果是下列错误,那么就解决了
nginx error: the HTTP rewrite module requires the PCRE library.

安装pcre-devel解决问题
yum -y install pcre-devel

错误提示:./configure: error: the HTTP cache module requires md5 functions…
yum -y install openssl openssl-devel

然后我们这些配置好就通过 ip +80端口 能访问我们的nginx了
在这里插入图片描述

配置负载均衡

这是我最后修改完毕的配置文件,并加上了注解以便理解
nginx的主配置文件结构

#定义Nginx运行的用户和用户组2
user root;

# nginx进程数,通常设置成和cpu的数量相等
worker_processes 1;

# 全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
# nginx.conf里会有两个日志,分为access.log 和 error.log
# access.log主要是记录"谁来登陆了,从哪里登陆的,登陆后发生了什么",具体格式可以在nginx.conf里设定
# error.log主要记录的是检查nginx.conf里发现的错误,模式不支持自定义
# 当打开error.log的时候,可能会看到各种样的内容,比如:
# 2018/05/03 10:20:51 [emerg] 20952#0: unexpected "}" in /usr/local/nginx/conf/nginx.conf:87
# 这句话就说明在nginx.conf的87行里有一个 } 是错误的,检查一下}是不是多余了,或者;少了,这个错误的级别是emergency
error_log /usr/local/nginx/logs/error.log info;

# 进程pid文件
# pid /var/log/nginx/nginx.pid; 
# 上面的配置会造成ngix找不到pid文件,换成下面的配置即可
pid /var/run/nginx.pid;

# 指定进程可以打开的最大描述符:数目
worker_rlimit_nofile 65535;

# 设置工作模式
events {
  # epoll是多路复用IO(I/O Multiplexing)中的一种方式,
  # 仅用于linux2.6以上内核,可以大大提高nginx的性能
  # 内核版本查看命令:cat /proc/version
  use epoll;

  # 定义每个进程的最大连接数,受系统进程的最大打开文件数量限制
  # 单个进程最大连接数(最大连接数=连接数*进程数)
  # 根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行
  worker_connections 65535;
}


# 设定http服务器
http {
  # 文件扩展名与文件类型映射表
  include mime.types;

  # 默认文件类型
  default_type application/octet-stream;

  # 默认编码,Nginx的页面中文乱码解决
  charset utf-8;

  # 隐藏Nginx版本号
  server_tokens off;

  # 设定日志格式
  # 为了观察缓存的命中状态,我们可以将缓存相关的变量记录在日志中。
  # nginx.conf中配置(在行尾加上'"$upstream_cache_status"'缓存命中状态即可)
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
		  '"$http_user_agent" "$http_x_forwarded_for" "$upstream_cache_status"';

  # 设定日志位置,建议生产阶段关闭
  access_log /usr/local/nginx/logs/access.log main;

  # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
  # sendfile: 设置为on表示启动高效传输文件的模式。sendfile可以让Nginx在传输文件时直接在磁盘和tcp socket之间传输数据。如果这个参数不开启,会先在用户空间(Nginx进程空间)申请一个buffer,用read函数把数据从磁盘读到cache,再从cache读取到用户空间的buffer,再用write函数把数据从用户空间的buffer写入到内核的buffer,最后到tcp socket。开启这个参数后可以让数据不用经过用户buffer
  #sendfile on;
  sendfile off;
  # 此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
  #tcp_nopush on;

  # 连接超时时间单位是秒,这里指的是http层面的keep-alive 并非tcp的keepalive
  keepalive_timeout 120;
  tcp_nodelay on;

  # 设定请求缓冲
  client_header_buffer_size 32k;
  large_client_header_buffers 4 64k;

  # 保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。
  # 参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。
  # 在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。
  # 如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,
  # 最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,
  # 第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 
  # hash bucket size的提示,那么首要的是增大前一个参数的大小.
  server_names_hash_bucket_size 128;

  # http_proxy设置
  proxy_redirect off;
  # 请求头中Host信息
  proxy_set_header HOST $host;
  # 真实的客户端IP
  proxy_set_header X-Real-IP $remote_addr;
  # 代理路由信息,此处取IP有安全隐患
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  # 真实的用户访问协议
  proxy_set_header X-Forwarded-Proto $scheme;

  # 设置通过nginx上传文件的大小
  # 注1:通过tomcat远程部署项目时,项目war可能比较大,这个数值可以设置大一些,发布完项目后再改回10m
  client_max_body_size 50m; 
  # client_max_body_size 10m;          
  client_body_buffer_size 128k;
  proxy_connect_timeout 75;
  proxy_send_timeout 75;
  proxy_read_timeout 75;
  proxy_buffer_size 4k;
  proxy_buffers 4 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;

  # 开启nginx的缓存功能
  # 定义nginx缓存目录
  # /usr/local/nginx/proxy_cache/cache缓存文件所在目录,默认不存在,创建即可
  # level=1:2 缓存的层次结构为2层
  # keys_zone 缓存空间名称为cache_one:10m,大小为10兆
  # inactive=60m 该缓存60分钟内没被访问就把清理掉
  # max_size=10g 最大文件缓存为10G,超过10GNginx的裁判机制会剔除不经常被访问的缓存
  # use_temp_path 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不使用temp_path指定的临时存储路径
  # use_temp_path=on 会生成一个临时的.tmp缓存,会和自己定义的 /usr/local/nginx/proxy_cache/cache 缓存冲突,导致性能下降,一般关闭
  proxy_cache_path /usr/local/nginx/proxy_cache/cache levels=1:2 keys_zone=cache_one:500m inactive=60m max_size=10g use_temp_path=off;
  # 定义nginx缓存临时目录
  # /usr/local/nginx/proxy_cache/temp临时文件所在目录。此项在 use_temp_path=off 时不需填写
  # proxy_temp_path /usr/local/nginx/proxy_cache/temp;

  # 开启目录列表访问,合适下载服务器,默认关闭。
  autoindex on;



  # 这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,
  # inactive是指经过多长时间文件没被请求后删除缓存。
  open_file_cache max=65535 inactive=60s;
  # 这个是指多长时间检查一次缓存的有效信息。
  open_file_cache_valid 80s;
  # open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,
  # 文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
  open_file_cache_min_uses 1;

  # gzip模块设置
  # 开启nginx gzip压缩后,网页、css、js等静态资源的大小会大大的减少,从而可以节约大量的带宽,
  # 提高传输效率,给用户快的体验。虽然会消耗cpu资源,但是为了给用户更好的体验是值得的
  # 怎么检测nginx有没有开启gzip?
  # 通过浏览器查看响应头:Accept-Encoding: 这部分是不是有gzip,有的话就是已经生效,例如:Accept-Encoding: gzip, deflate
  gzip on;
  gzip_disable "MSIE [1-6].";
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
             text/javascript application/javascript application/x-javascript
             text/x-json application/json application/x-web-app-manifest+json
             text/css text/plain text/x-component
             font/opentype application/x-font-ttf application/vnd.ms-fontobject
             image/x-icon;
  gzip_vary on;

  # 开启限制IP连接数的时候需要使用
  #limit_zone crawler $binary_remote_addr 10m;

  # 负载均衡配置
  # 设定负载均衡后台服务器列表
  # 在需要使用负载均衡的server中增加 proxy_pass http://server_pool;
  upstream server_pool {
    # ip_hash轮询方式:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,
    # 可以有效解决session问题,不可给服务器加权重weight
    ip_hash;
    
    # tomcat列表
    # max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
    # fail_timeout:max_fails次失败后,暂停的时间。

    #server 192.168.199.131:8080 weight=10; //本机ip 但不可使用此种写法,使用下面127的写法
    #因为我们此时转发到的是本机的8080端口,如果使用本机ip的话还需要进行tcp连接,
    #这时候防火墙就会把这个端口的tcp连接给拦截掉,本机也无法访问这个ip的某一端口,使用127.0.0.1就可以完美的避开这个问题

    # 指定轮询机率,weight和访问比率成正比,用于后端服务器性能不均的情况
    #server 127.0.0.1:8080 weight=10;
    server 192.168.43.11:8080 weight=10;
  }

  #虚拟主机的配置
  server {
    # 监听端口
    listen 80;

    # 域名可以有多个,用空格隔开
    # 这里随便写域名或者 删除 server_name都能正常访问
    server_name _;

    # 必须配置开启缓存功能的location的前面否则不生效
    # 用于清除缓存的url设置
    # 假设一个URL为http://www.wangshibo.com/test.gif,那么就可以通过访问http://www.wangshibo.com/purge/test.gif清除该URL的缓存。
    #location ~ /purge(/.*) {
      #设置只允许指定的IP或IP段才可以清除URL缓存
      #allow 127.0.0.1 ;
      #allow 192.168.0.0/16 ;
      #允许所有IP清除URL缓存 
      #allow all;
      #拒绝所有IP清除URL缓存
      #deny all ;
      #proxy_cache_purge cache_one $host$1$is_args$args ;
    #}

    # / 匹配所有路径,默认对所有请求都做负载均衡+反向代理
    location / {
        # 可以通过添加自定义header判断URL匹配了哪个location
        #add_header Access-Control-Location '/'; 

        #这里server_pool指向上面名为server_pool的upstream
	proxy_pass http://server_pool; 
    }



    # 静态处理交给nginx
    location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|ico|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|css|js)$ {
      # 可以通过添加自定义header判断URL匹配了哪个location
      #add_header Access-Control-Location 'js|css|images';

      # nginx对后端静态资源做缓存
      # 使用Web缓存区cache_one,已在nginx.conf的缓存配置中命名的。
      proxy_cache cache_one;

      # 状态码为200 302 304的缓存12小时,其余的缓存10分钟
      proxy_cache_valid 200 304 302 12h;
      proxy_cache_valid any 10m;

      # 添加自定义响应头中定义缓存的状态:
      # $upstream_cache_status包含以下几种状态:
      # MISS 未命中,请求被传送到后端
      # HIT 缓存命中
      # EXPIRED 缓存已经过期请求被传送到后端
      # UPDATING 正在更新缓存,将使用旧的应答
      # STALE 后端将得到过期的应答
      add_header Nginx-Cache '$upstream_cache_status from $host';

      # 如果出现以下error,或者50*的状态码,将会重新负载调度到另一台服务器上重新请求(不会在一台服务器上死磕)
      proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

      # 设置Web缓存的Key值,Nginx根据Key值md5哈希存储缓存,这里根据"域名,URI,参数"组合成Key
      proxy_cache_key $host$uri$is_args$args;

      # 忽略浏览器中的一些缓存参数,而开启缓存
      proxy_ignore_headers Set-Cookie Cache-Control;
      proxy_hide_header Cache-Control;
      proxy_hide_header Set-Cookie;


      proxy_pass http://server_pool;
    }


    

    # 定义错误提示页面,如果在web项目中已经配置500/404错误页面,这里就不用配置了
    #error_page 500 502 503 504 /50x.html;
    #location = /50x.html {
    #}

     
    # 设定查看Nginx状态的地址,状态值示例如下:
    # Active connections: 11921 
    # server accepts handled requests
    #    11989 11989 11991 
    # Reading: 0 Writing: 7 Waiting: 42
    # active connections – 活跃的连接数量
    # server accepts handled requests — 总共处理了11989个连接 , 成功创建11989次握手, 总共处理了11991个请求
    # reading — 读取客户端的连接数.
    # writing — 响应数据到客户端的数量
    # waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.
    # nginx  unknown directive "stub_status",离线安装模式默认没有安装Nginx没有添加modules/ngx_http_stub_status_module.o模块
    #location /nginx_status {
        #stub_status on;
        #access_log off;
	#deny 127.0.0.1;  #拒绝的ip
        #allow 172.18.5.54; #允许的ip
        #allow 127.0.0.1;
        #deny all;
    #}
  }
}

cd /usr/local/nginx/conf/

vi nginx.conf

ps -ef | grep nginx # 查看Nginx安装目录,master process后面的就是nginx的目录
nginx的主配置文件结构(重点)
nginx的主配置文件/usr/local/nginx/conf/nginx.conf主要分分为六个区域:
main(全局设置)、events(nginx工作模式)、http(http设置)、
sever(主机设置)、location(URL匹配)、upstream(负载均衡服务器设置)。

配置文件结构图
在这里插入图片描述

我们这里配置只是负载均衡多个tomcat,配置不同的tomcat地址
如果是在springcloud项目中我们nginx对应的应该是多个zuul网关

开启轮询算法,配置负载均衡地址
在这里插入图片描述
然后我们用tomcat发布一个测试项目
在这里插入图片描述
在这里插入图片描述
然后访问通过tomcat访问项目
在这里插入图片描述
然后我们已经配置好了nginx,再来通过nginx来访问tomcat,访问成功!
在这里插入图片描述
end…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章