欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Nginx安装及入门

程序员文章站 2024-01-20 18:40:34
...

PS:此文档测试环境为Linux(CentOS7)虚拟机,此安装方法必须保证虚拟机可以访问外网。

安装Nginx所需组件
GCC编译器:用来编译C语言环境,Nginx不会提供二进制可执行程序,只能下载源码进行编译;

命令:查看gcc版本

gcc -v

Nginx安装及入门
此处我们已有,如果没有安装的话会提示命令找不到;

安装命令:

yum -y install gcc

PCRE库:专门用来做正则表达式的,Nginx里面很多地方都用到了正则表达式,因此需要进行安装;

安装命令:

yum install - y pcre pcre-devel

安装中途可能需要输入 “y” 确认。
Nginx安装及入门
Nginx安装及入门
最后提示 “Complete” 说明安装完成。

zlib库:用于对HTTP包的内容做gzip格式的压缩,如果我们在nginx.conf里配置了gzip on,并制定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量;

安装命令:

yum install -y zlib zlib-devel

Nginx安装及入门
同上面PCRE库安装一样,Complete!说明安装完成。

OpenSSL开发库:如果我们的服务器不只是要支持HTTP,还需要在更安全的SSL协议上传输HTTP,那么久需要拥有OpenSSL了。另外,如果我们想使用MD5、SHA1等散列函数,那么也需要安装它。

安装命令:

yum install -y openssl openssl-devel

Nginx安装及入门
到此Nginx所需组件即安装完成了。

安装Nginx
进入 /usr/local/ 目录下,新建文件夹 soft :
Nginx安装及入门
进入 soft 文件夹执行命令:

wget http://nginx.org/download/nginx-1.9.9.tar.gz  

Nginx安装及入门
ls 后可以看到已经下载好了,现在开始解压,解压命令:

tar -zxvf nginx-1.9.9.tar.gz

Nginx安装及入门
此处我在 /usr/local/ 目录下新建了一个文件夹nginx,并在解压命令后指定了解压路径,解压到了刚刚创建的nginx目录下。
Nginx安装及入门
进入到nginx目录可以看到已经解压完成,然后进入 nginx-1.9.9目录。
Nginx安装及入门
依次执行命令:

./configure

make

make install

至此,Nginx就安装完成了,下面我们测试启动Nginx。

启动Nginx
返回我们刚刚解压nginx时创建的nginx目录下。
Nginx安装及入门
可以看到,除了我们解压得到的 nginx-1.9.9,多了几个文件夹,进入 sbin 目录。
执行命令:

./nginx

Nginx安装及入门
感觉什么都没发生,一般就是启动成功了,查看 nginx状态,执行命令:

ps -ef | grep nginx

Nginx安装及入门
可以看到已经启动了,接下来访问你的服务器IP,Nginx默认端口为 80 记得带上。
Nginx安装及入门
emm… 什么都没有,可能是我们防火墙忘记关了,解决方法有两种,开放Nginx端口和关闭防火墙,此处咱就使用简单快捷的关闭防火墙方法。
关闭防火墙:

systemctl stop firewalld.service

Nginx安装及入门
查看防火墙状态:

systemctl status firewalld.service

Nginx安装及入门
(dead) 说明已经关闭,再次访问Nginx。
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,代理把请求返回的相应结构再返回给我。

Nginx安装及入门

反向代理:大家都有过这样的经历,拨打10086客服电话,可能一个地区的10086客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已。那么这里的10086总机号码就是我们说的反向代理。客户不知道真正提供服务人的是谁。
反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。

Nginx安装及入门

两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端。

(ps:此段解释选自知乎大神回复,帖子地址:https://www.zhihu.com/question/24723688

正向代理例子
编辑nginx.conf配置文件:
Nginx安装及入门
注释或删除默认location并新建一个,指向百度地址,保存后重启nginx:

systemctl restart nginx

再访问之前访问的nginx路径(ip地址:端口号)
Nginx安装及入门
回车
Nginx安装及入门
这就是一个简单的正向代理例子:我们访问代理服务器的地址(如:192.168.245.128:80),由代理服务器访问至实际访问地址,此处代理服务器代理的是客户端。

反向代理例子:
首先安装一个tomcat在虚拟机,然后在tomcat的webapps目录中新建一个test目录,再在test中新建一个index.html文件。

新建文件命令:touch 文件名称

Nginx安装及入门
index.html中的内容如下:
Nginx安装及入门
tomcat端口默认为8080,启动tomcat并在主机访问:
Nginx安装及入门
访问成功!

回到nginx目录,在nginx.conf文件中注释之前指向百度得location并新建一个location,指向刚刚安装的tomcat的访问地址:
Nginx安装及入门
保存后重启nginx,然后访问nginx:
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模块来实现负载均衡:
Nginx安装及入门
http模块下定义一个upstream模块,命名为testcom,在其中指向两个tomcat(tomcat可以复制一份修改一下端口即可),将之前的location配置代理至upstream模块,保存并重启nginx。

访问:
Nginx安装及入门
Nginx安装及入门
这样如果我们部署多个相同的系统,可以把所有的并发流量分到多个上面,从而达到提高并发的目的。
这时候两个系统切换着访问,策略默认是轮训的,也就是无论几个系统都轮着循环访问。

2)weight 权重

如果想让两台机器的访问数量按照1比2分配,那么可以设置权重:
Nginx安装及入门
再次访问会发现8080访问一次,8090访问两次这样循环,在实际应用中,可以给配置好的服务器设置更高的权重以缓解服务器的压力。适合机器性能有区别的情况。

3)backup 备份服务

再复制一份tomcat并启动,端口号为8100,用此tomcat当做备份服务:
Nginx安装及入门

重启nginx后访问,这时还是8080一次,8090两次轮训访问,然后我们停止8080和8090的tomcat,再次会发现访问到了8100:
Nginx安装及入门

注意:关闭一个服务不会触发备用服务,只有8080和8090全都意外停止,8100才会顶上来!

再将8080重新启动,那备份服务就没作用了:
Nginx安装及入门

4)max_fails和max_timeout

nginx在原来的8080服务器重新启动以后,能很快检测到原来的8080恢复了,并投入使用,是因为nginx和8080之间有类似心跳检测的机制,实时监控8080是否能用。上面的max_fails参数就是设置失败多少次后,认为已经挂了,就剔除,fail_timeout参数就是剔除后重新检测这个属性也是设置恢复时检测的时长间隔,比如设置一分钟,那么服务恢复后得隔一分钟才能检测到并投入使用。可以想象,如果实时去检查的话,会很消耗性能,所以这两个参数非常有用。下面我们把失败最大重试次数设置成10次,恢复检测时长设置成30秒:
Nginx安装及入门
重启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 初学者