CentOS7下安装nginx1.99

导读:本篇文章讲解 CentOS7下安装nginx1.99,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

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/

正常的情况是如下页面:
图3
如果访问不了,大概率的情况还是防火墙没开端口

[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就是上下文路径,指定800180028003三个端口启动
		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/;

每个设备的状态设置为:

  1. down表示单前的server暂时不参与负载
  2. weight为weight越大,负载的权重就越大。
  3. max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
  4. fail_timeout:max_fails次失败后,暂停的时间。
  5. 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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!