Nginx安装及入门
PS:此文档测试环境为Linux(CentOS7)虚拟机,此安装方法必须保证虚拟机可以访问外网。
安装Nginx所需组件
GCC编译器:用来编译C语言环境,Nginx不会提供二进制可执行程序,只能下载源码进行编译;
命令:查看gcc版本
gcc -v
此处我们已有,如果没有安装的话会提示命令找不到;
安装命令:
yum -y install gcc
PCRE库:专门用来做正则表达式的,Nginx里面很多地方都用到了正则表达式,因此需要进行安装;
安装命令:
yum install - y pcre pcre-devel
安装中途可能需要输入 “y” 确认。
最后提示 “Complete” 说明安装完成。
zlib库:用于对HTTP包的内容做gzip格式的压缩,如果我们在nginx.conf里配置了gzip on,并制定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量;
安装命令:
yum install -y zlib zlib-devel
同上面PCRE库安装一样,Complete!说明安装完成。
OpenSSL开发库:如果我们的服务器不只是要支持HTTP,还需要在更安全的SSL协议上传输HTTP,那么久需要拥有OpenSSL了。另外,如果我们想使用MD5、SHA1等散列函数,那么也需要安装它。
安装命令:
yum install -y openssl openssl-devel
到此Nginx所需组件即安装完成了。
安装Nginx
进入 /usr/local/ 目录下,新建文件夹 soft :
进入 soft 文件夹执行命令:
wget http://nginx.org/download/nginx-1.9.9.tar.gz
ls 后可以看到已经下载好了,现在开始解压,解压命令:
tar -zxvf nginx-1.9.9.tar.gz
此处我在 /usr/local/ 目录下新建了一个文件夹nginx,并在解压命令后指定了解压路径,解压到了刚刚创建的nginx目录下。
进入到nginx目录可以看到已经解压完成,然后进入 nginx-1.9.9目录。
依次执行命令:
./configure
make
make install
至此,Nginx就安装完成了,下面我们测试启动Nginx。
启动Nginx
返回我们刚刚解压nginx时创建的nginx目录下。
可以看到,除了我们解压得到的 nginx-1.9.9,多了几个文件夹,进入 sbin 目录。
执行命令:
./nginx
感觉什么都没发生,一般就是启动成功了,查看 nginx状态,执行命令:
ps -ef | grep nginx
可以看到已经启动了,接下来访问你的服务器IP,Nginx默认端口为 80 记得带上。
emm… 什么都没有,可能是我们防火墙忘记关了,解决方法有两种,开放Nginx端口和关闭防火墙,此处咱就使用简单快捷的关闭防火墙方法。
关闭防火墙:
systemctl stop firewalld.service
查看防火墙状态:
systemctl status firewalld.service
(dead) 说明已经关闭,再次访问Nginx。
访问成功!
Nginx默认配置
进入Nginx安装目录的 conf 目录下,查看nginx.conf文件内容:
cat 文件名 #查看文件内容
nginx.conf 的初始内容如下:
#user nobody;
worker_processes 1;#工作进程,根据安装Nginx的机器的硬件调整,一般等于机器CPU的数量
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;#nginx进程pid的存放路径
events {
worker_connections 1024;#工作进程最大连接数
}
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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;#开启gzip压缩服务
server {
listen 80;#默认监听80端口
server_name localhost;#监听访问域名,localhost代表本机也就是安装nginx的虚拟机
#charset koi8-r;#字符集设置
#access_log logs/host.access.log main;
location / {#监听路径 /代表路径
root html;//此访问路径的文件根路径
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 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;
# }
#}
}
正向代理和反向代理及其区别
正向代理:A同学在大众创业、万众创新的大时代背景下开启他的创业之路,目前他遇到的最大的一个问题就是启动资金,于是他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了,情急之下,他想到一个办法,找关系开后门,经过一番消息打探,原来A同学的大学老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。
我们常说的代理也就是只正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,某些*工具扮演的就是典型的正向代理角色。用浏览器访问http://www.google.com 时,被残忍的block,于是你可以在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。
反向代理:大家都有过这样的经历,拨打10086客服电话,可能一个地区的10086客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已。那么这里的10086总机号码就是我们说的反向代理。客户不知道真正提供服务人的是谁。
反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。
两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端。
(ps:此段解释选自知乎大神回复,帖子地址:https://www.zhihu.com/question/24723688)
正向代理例子:
编辑nginx.conf配置文件:
注释或删除默认location并新建一个,指向百度地址,保存后重启nginx:
systemctl restart nginx
再访问之前访问的nginx路径(ip地址:端口号)
回车
这就是一个简单的正向代理例子:我们访问代理服务器的地址(如:192.168.245.128:80),由代理服务器访问至实际访问地址,此处代理服务器代理的是客户端。
反向代理例子:
首先安装一个tomcat在虚拟机,然后在tomcat的webapps目录中新建一个test目录,再在test中新建一个index.html文件。
新建文件命令:touch 文件名称
index.html中的内容如下:
tomcat端口默认为8080,启动tomcat并在主机访问:
访问成功!
回到nginx目录,在nginx.conf文件中注释之前指向百度得location并新建一个location,指向刚刚安装的tomcat的访问地址:
保存后重启nginx,然后访问nginx:
回车
访问成功!(没成功的话清一下浏览器缓存或仔细检查配置文件是否有误还有tomcat是否启动成功)
这就是反向代理了,也就是说我们要访问的目标服务器地址为192.168.245.128:80,但是nginx会将请求转交给真正处理的后端服务器(tomcat),在这里代理服务器代理的是服务端
相关参数:
proxy_pass # 代理服务
proxy_redirect off; # 是否允许重定向
proxy_set_header Host $host; # 传 header 参数至后端服务
proxy_set_header X-Forwarded-For $remote_addr; # 设置request header 即客户端IP 地址
proxy_connect_timeout 90; # 连接代理服务超时时间
proxy_send_timeout 90; # 请求发送最大时间
proxy_read_timeout 90; # 读取最大时间
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
6. 负载均衡
1) upstream模块
upstream相关参数:
service #反向服务地址加端口
weight #权重
max_fails #失败多少次认为主机已挂掉则,踢出
fail_timeout #踢出后重新探测时间
backup #备用服务
max_conns #允许最大连接数
proxy_pass可以将请求代理至后端,但是为了实现更高的负载及性能,我们的后端服务通常是多个,这个时候可以通过upstream模块来实现负载均衡:
http模块下定义一个upstream模块,命名为testcom,在其中指向两个tomcat(tomcat可以复制一份修改一下端口即可),将之前的location配置代理至upstream模块,保存并重启nginx。
访问:
这样如果我们部署多个相同的系统,可以把所有的并发流量分到多个上面,从而达到提高并发的目的。
这时候两个系统切换着访问,策略默认是轮训的,也就是无论几个系统都轮着循环访问。
2)weight 权重
如果想让两台机器的访问数量按照1比2分配,那么可以设置权重:
再次访问会发现8080访问一次,8090访问两次这样循环,在实际应用中,可以给配置好的服务器设置更高的权重以缓解服务器的压力。适合机器性能有区别的情况。
3)backup 备份服务
再复制一份tomcat并启动,端口号为8100,用此tomcat当做备份服务:
重启nginx后访问,这时还是8080一次,8090两次轮训访问,然后我们停止8080和8090的tomcat,再次会发现访问到了8100:
注意:关闭一个服务不会触发备用服务,只有8080和8090全都意外停止,8100才会顶上来!
再将8080重新启动,那备份服务就没作用了:
4)max_fails和max_timeout
nginx在原来的8080服务器重新启动以后,能很快检测到原来的8080恢复了,并投入使用,是因为nginx和8080之间有类似心跳检测的机制,实时监控8080是否能用。上面的max_fails参数就是设置失败多少次后,认为已经挂了,就剔除,fail_timeout参数就是剔除后重新检测这个属性也是设置恢复时检测的时长间隔,比如设置一分钟,那么服务恢复后得隔一分钟才能检测到并投入使用。可以想象,如果实时去检查的话,会很消耗性能,所以这两个参数非常有用。下面我们把失败最大重试次数设置成10次,恢复检测时长设置成30秒:
重启nginx,然后停止8080和8090,访问页面,可以看到加载了一会才会出现8100的结果,如果重试次数设置成100次,加载时间会更明显。我们把8080启动起来,可以看到前面三十秒左右还是8100,后面又开始访问8080。
这两个参数也是很重要的参数,在实际生成环境中会用到。要合理设置重试次数和等待时间。
5)负载均衡算法
上面介绍了简单的负载均衡,也涉及到了简单的轮训的负载均衡和加权重的负载均衡算法,下面专门介绍一下upstream 负载均衡算法:
ll+weight: 轮询加权重 (默认) 缺点是,其中一个连接满了,nginx还是会加连接过去导致连接越来越多,速度越来越慢,不够自动化和智能化
ip_hash : 基于Hash 计算 ,用于保持session 一至性,解决分布式session同步问题,缺点是现在很多小区或者学校都是用的一根光纤,大部分人的ip是一样的,容易导致某个服务连接数量过多,出现负载不均衡的情况,而且机器挂掉,会话随着会丢失
url_hash: 静态资源缓存,节约存储,加快速度(第三方),和ip_hash的计算方法一样,应用场景不同,通过这种算法可以把一些静态资源平均分布到各个服务中,节省空间
least_conn :最少链接(第三方),可以优先把请求分给和nginx连接最少的服务,最大化的利用资源
least_time :最小的3响应时间,计算节点平均响应时间,然后取响应最快的那个,分配更高权重(第三方),可以充分利用性能好的机器
文章为本人学习时编写,部分内容选自学习的文章:
NGINX学习(完)
centOS7安装nginx及nginx配置
下一篇: Nginx安装及配置
推荐阅读
-
Window 下安装Mysql5.7.17 及设置编码为utf8的方法
-
PHP开发利器-PRADO 1.6入门与安装_PHP
-
C++环境安装及 如何用 Sublime Text 实现C/C++代码的编译运行
-
CentOS部署NetCore - 1. 安装CentOS 7 & 安装 Nginx
-
Ubuntu上的phppgAdmin安装及配置
-
phpunit安装出错的原因及解决方法
-
Windows下安装python2.7及科学计算套装
-
Nginx安装lua-nginx-module模块
-
linux下安装protobuf及cmake编译
-
php操作xml入门之xml基本介绍及xml标签元素_PHP教程