文章目录
1、前期准备
1.1 安装gcc
首先检查是否安装了gcc
[root@hadoop-master test]# gcc -v
bash: gcc: 未找到命令...
本机没有安装gcc,因此使用一下命令安装gcc
[root@hadoop-master test]# yum -y install gcc gcc-c++ autoconf automake make
安装完成之后再检查gcc版本
1.2 安装其他依赖包
其他依赖包如下,我们一次安装:pcre-devel、zlib-devel、openssl-devel
[root@hadoop-master test]# yum -y install pcre-devel zlib-devel openssl openssl-devel
1.3 下载安装包
可以在官网直接下载:http://nginx.org/download/
也可以通过如下命令行进行下载
[root@hadoop-master test]# wget http://nginx.org/download/nginx-1.9.9.tar.gz
2、安装nginx
2.1 解压nginx
文中将nginx-1.9.9.tar.gz放在目录:/usr/local
解压nginx-1.9.9.tar.gz
[root@hadoop-master local]# cd /usr/local
[root@hadoop-master local]# tar zxvf nginx-1.9.9.tar.gz
2.2 编译安装
配置
[root@hadoop-master local]# cd nginx-1.9.9/
[root@hadoop-master nginx-1.9.9]# ./configure --prefix=/usr/local/nginx
编译、安装
[root@hadoop-master nginx-1.9.9]# make
[root@hadoop-master nginx-1.9.9]# make install
检查是否安装成功
[root@hadoop-master nginx-1.9.9]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
2.3 启动
启动我们的nginx
/usr/local/nginx/sbin/nginx
访问我们虚拟机的ip地址
http://192.168.223.131/
正常的情况是如下页面:
如果访问不了,大概率的情况还是防火墙没开端口
[root@hadoop-master nginx-1.9.9]# firewall-cmd --query-port=80/tcp
no
将80端口加入到防火墙中
[root@hadoop-master nginx-1.9.9]# firewall-cmd --add-port=80/tcp --permanent
#重启防火墙
[root@hadoop-master nginx-1.9.9]# systemctl restart firewalld
再次查看端口状态
[root@hadoop-master nginx-1.9.9]# firewall-cmd --query-port=80/tcp
yes
至此,CentOS7下安装nginx结束。
2.4 常用命令
我本地的nginx命令位置:/usr/local/nginx/sbin/nginx
启动nginx,默认监听80端口
nginx
启动指定配置文件的nginx:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
快速停止服务器:
nginx -s stop
停止服务器,但要等到请求处理完毕后关闭:
nginx -s quit
重新加载配置文件:
nginx -s reload
指定配置文件重启
/usr/local/nginx/sbin/nginx -s reload -c /usr/local/nginx/conf/nginx.conf
3、Nginx配置
配置文件位置/usr/local/nginx/conf/nginx.conf
配置文件结构如下:
配置内容省略... #全局块
events { #events块
配置内容省略...
}
http #http块
{
配置内容省略... #http全局块
server #server块
{
配置内容省略... #server全局块
location [PATTERN] #location块
{
配置内容省略...
}
location [PATTERN]
{
配置内容省略...
}
}
server
{
配置内容省略...
}
配置内容省略... #http全局块
}
1、全局块:
配置影响nginx全局的指令。一般有运行nginx配置器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:
配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接收多个网络连接,开启多个网络连接序列化等。
3、http块:
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,但连接请求数等。
4、server块:
配置虚拟机主机的相关参数,一个http中可以有多个server。
5、location:
配置请求路由,以及各种页面的处理情况。
# 配置用户及组,默认是nobody nobody
#user nobody;
# 工作进程:数据。根据硬件调整,通常等于CPU数量或者2倍于CPU。
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;
# pid(进程标识符):存放路径。
pid logs/nginx.pid;
# 指定进程可以打开的最大描述符:数目。这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。如果总并发量超过这个数据可能会返回502错误。
worker_rlimit_nofile 102400;
events {
accept_mutex on; # 设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; # 设置一个进程是否同时接受多个网络连接,默认为off
use epoll; # 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 102400; # 每个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
}
http {
include mime.types; # 文件或站名与文件类型映射表
default_type application/octet-stream; # 默认文件类型,默认为text/plain
#access_log off; # 取消服务日志
log_format myFormat '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location'; # 自定义格式
# 用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;
access_log logs/access.log myFormat;
# 用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;
access_log logs/host.access.404.log log404;
# 保存服务器名字的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;
# 客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
client_header_buffer_size 4k;
# 客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。
large_client_header_buffers 8 128k;
# 这个指令指定缓存是否启用
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s; # 语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.
open_file_cache_min_uses 2; # 语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location 这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.
open_file_cache_errors on; # 语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误.
# 设定通过nginx上传文件的大小(如果上传文件比较大可以修改这个值)
client_max_body_size 300m;
# sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。
# 如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
sendfile on;
# 此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
tcp_nopush on;
# 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 90;
# 连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
proxy_read_timeout 180;
# 后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_send_timeout 180;
# 设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
proxy_buffer_size 256k;
# 设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
proxy_buffers 4 256k;
# 忙时buffer 的最大值。 一个客户端一次只能从一个buffer 中读取数据的同时,剩下的buffer 会被放到队列中,等待发送到客户端,这个directive 指定在这个状态下的buffer 的大小
proxy_busy_buffers_size 256k;
# 设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
proxy_temp_file_write_size 256k;
# proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path /usr/local/nginx/data0/proxy_temp_dir;
# 设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为10GB。
proxy_cache_path /usr/local/nginx/data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=10g;
#keepalive超时时间
keepalive_timeout 120;
# 也是一个 socket 选项,启用后会禁用 Nagle 算法,尽快发送数据,某些情况下可以节约 200ms
#(Nagle 算法原理是:在发出去的数据还未被确认之前,新生成的小数据先存起来,凑满一个 MSS 或者等到收到确认后再发送)。
# Nginx 只会针对处于 keep-alive 状态的 TCP 连接才会启用 tcp_nodelay。
# 可以看到 TCP_NOPUSH 是要等数据包累积到一定大小才发送,TCP_NODELAY 是要尽快发送,二者相互矛盾。实际上,它们确实可以一起用,最终的效果是先填满包,再尽快发送。
tcp_nodelay on;
# 如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。
# 如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
# 无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
client_body_buffer_size 512k;
# 我们在上线前,代码(JS、CSS 和 HTML)会做压缩,图片也会做压缩(PNGOUT、Pngcrush、JpegOptim、Gifsicle 等)。
# 对于文本文件,在服务端发送响应之前进行 GZip 压缩也很重要,通常压缩后的文本大小会减小到原来的 1/4 - 1/3
#gzip on;
# 表示使nginx阻止HTTP应答代码为400或者更高的应答。
proxy_intercept_errors on;
# nginx的upstream配置
upstream bakend {
ip_hash;
server hadoop-master:8001;
server hadoop-master:8002;
server hadoop-master:8003;
}
server {
# 配置监听端口
listen 80;
# 配置访问域名
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
# 这是个springboot项目/helloworld-demo就是上下文路径,指定8001,8002,8003三个端口启动
location /helloworld-demo {
proxy_pass http://bakend;
}
#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 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;
# }
#}
}
use epoll 配置说明
使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
补充说明:
与apache相类,nginx针对不同的操作系统,有不同的事件模型
A)标准事件模型
Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
B)高效事件模型
Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
Epoll:使用于Linux内核2.6版本及以后的系统。
/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
log_format日志格式设置
$remote_addr 与 $http_x_forwarded_for用以记录客户端的ip地址:
$remote_user:
用来记录客户端用户名称;
$time_local:
用来记录访问时间与时区;
$request:
用来记录请求的url与http协议;
$status:
用来记录请求状态;成功是200,
$body_bytes_sent :
记录发送给客户端文件主体内容大小;
$http_referer:
用来记录从那个页面链接访问过来的;
$http_user_agent:
记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
nginx的upstream的几种分配方式
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream bakend {
server 192.168.0.14;
server 192.168.0.15;
}
2、weight(加权轮询)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
ip_hash使用的是ip地址前三位作为hash的key,如果是内网情况下会发现所有机器都映射到一台机器,如果想实现内网的ip_hash参考《Nginx在局域网内实现真正的ip_hash负载均衡》
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
注意:
upstream bakend{ # 定义负载均衡设备的Ip及设备状态
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用负载均衡的server中增加:
proxy_pass http://bakend/;
每个设备的状态设置为:
- down表示单前的server暂时不参与负载
- weight为weight越大,负载的权重就越大。
- max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
- fail_timeout:max_fails次失败后,暂停的时间。
- backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
nginx支持同时设置多组的负载均衡
,用来给不用的server来使用。
client_body_in_file_only
设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path
设置记录文件的目录 可以设置最多3层目录
location对URL进行匹配
可以进行重定向或者进行新的代理 负载均衡
参考:
本博客 Nginx 配置之性能篇(https://imququ.com/post/my-nginx-conf-for-wpo.html)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72675.html