前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Nginx的搭建与核心配置(图文详解)

Nginx的搭建与核心配置(图文详解)

作者头像
IT运维技术圈
发布2023-09-07 17:36:04
发布2023-09-07 17:36:04
8.8K00
代码可运行
举报
文章被收录于专栏:IT运维技术圈IT运维技术圈
运行总次数:0
代码可运行
一.Nginx是什么?

1.Nginx概述

一款高新能、轻量级Web服务软件 系统资源消耗低 对HTTP并发连接的处理能力高 单台物理服务器可支持30 000~50 000个并发请求。 Nginx(发音同"engine x")是一个高性能的反向代理和 Web服务器软件,最初是由俄罗斯人 Igor Sysoev开发的。Nginx 的第一个版本发布于2004年,其源代码基于双条款 BSD许可证发布,因其系统资源消耗低、运行稳定且具有高性能的并发处理能力等特性,Nginx 在互联网企业中得到广泛应用。Nginx 是互联网上最受欢迎的开源 Web 服务器之一,它不仅提供了用于开发和交付的一整套应用技术,还是应用交付领域的开源领导者。

2019年 3月,著名硬件负载均衡厂商F5宣布收购 Nginx,Nginx成为F5的一部分。F5表示,将加强对开源和 Nginx 应用平台的投资,致力于Nginx 开源技术、开发人员和社区的发展,更大的投资将为开放源码计划注人新的活力,会主办更多的开放源码活动,并产生更多的开放源码内容。

2.Nginx模块与作用

代码语言:javascript
代码运行次数:0
运行
复制
main模块:全局配置模块,所有模块都要执行遵守

配置运行nginx服务器的用户(组)、worker_process数(进程)、nginx进程PID存放路径、错误日志存放路径、配置文件的引入等stream服务模块:实现反向代理功能,包括TCP协议代理邮件服务模块:主要用于支持 Nginx 的邮件服务对 POP3 协议、 IMAP 协议和 SMTP协议的支持

第三方模块:二次开发,为了扩展 Nginx 服务器应用,完成开发者自定义功能

Json 支持、 Lua 支持等

events模块:影响nginx服务器与用户的网络连接

events {                                              #events模块设置

woker_connections 65536;                #设置单个工作进程最大并发连接数

use epoll;                                           #事件驱动类型选择为epoll

accept_mutex on;                              #同一时刻一个请求轮流由work进程除了,即轮询

multi_accept on;                                #每个工作进程同时接受多个网络连接

}

http模块:跟web服务相关,主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,包含几个子模块

自定义服务日志、允许sendfile方式传输文件、连接超时时间、单连接请求数上限、Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等

location模块:uri网址定位

server模块:服务模块

配置80端口监听、虚拟主机、DNS域名解析等

auth_basic模块:对网页设置用户名密码

gzip模块:压缩

proxy模块:设置后端IP地址、端口号及http和加密的https

ssl模块:https加密

3.Nginx三大作用:反向代理、负载均衡、动静分离

代码语言:javascript
代码运行次数:0
运行
复制
反向代理:在服务端 配置,客户端 访问服务器A ,服务器A 为代理服务器 ,将客户服务再转发到服务器B 
作用:缓存,将服务器的响应缓存在自己的内存中,减少服务器压力;
负载均衡:将用户请求分配给多个服务器;访问控制

正向代理:在客户端 配置,配置完了再去访问具体服务,即代理服务器 代理了客户端 ,再去和目标服务器 进行交互
作用:提高访问速度,隐藏客户端真实IP地址
负载均衡:分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务

nginx七层负载均衡调度算法(六种)

1、轮询(默认调度算法)

特点:每个请求按时间顺序逐一分配到不同的后端服务器处理。 适用业务场景:后端服务器硬件性能配置完全一致,业务无特殊要求时使用。

代码语言:javascript
代码运行次数:0
运行
复制
upstream backendserver {
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}

2、加权轮询

特点:指定轮询几率,weight值(权重)和访问比例成正比,用户请求按权重比例分配。 适用业务场景:用于后端服务器硬件性处理能力不平均的情形。

代码语言:javascript
代码运行次数:0
运行
复制
upstream backendserver {
server 192.168.0.14:80 weight=5 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 weight=10 max_fails=2 fail_timeout=10s;
}

3、ip_hash(IP哈希)

特点:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session会话保持问题。 适用业务场景:适用于需要账号登录的系统,会话连接保持的业务。

代码语言:javascript
代码运行次数:0
运行
复制
upstream backendserver {
ip_hash;
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}

4、最少连接数 least_conn

特点:按nginx反向代理与后端服务器之间的连接数,连接数最少的优先分配。

适用业务场景:适用于客户端与后端服务器需要保持长连接的业务。

代码语言:javascript
代码运行次数:0
运行
复制
upstream backendserver {
least_conn; server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}

5、响应时间 fair(需编译安装第三方模块 ngx_http_upstream_fair_module)

特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配。 适用业务场景:对访问响应速度有一定要求的业务。

代码语言:javascript
代码运行次数:0
运行
复制
upstream backendserver {
fair;
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}

6、url_hash(URL分配 )

(需编译安装第三方模块ngx_http_upstream_hash_module)

特点:按访问url的hash结果来分配请求,使同一个url访问到同一个后端服务器。

适用业务场景:适用于后端服务器为缓存服务器时比较有效。

代码语言:javascript
代码运行次数:0
运行
复制
upstream backendserver {
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
hash $request_uri;
}

动静分离:采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项针对PHP的动静分离:静态页面交给Nginx处理,动态页面交给PHP-FPM模块或Apache处理。

在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式,通过使用Nginx提高网站的响应速度,优化用户体验

二.Nginx和Apache的差异

Apache:同步多进程模型:一个连接对应一个进程(高稳定)

1.rewrite更强大(rewrite主要功能是实现统一资源定位符URL的跳转) 2.模块多,基本想到的都可以找到 3.少bug,更加稳定(nginx相对较多) 4.PHP支持比较简单(nginx需要配合其他后端用) 5.处理动态请求更有优势(nginx更适合静态与反向)

Nginx:异步非阻塞模型:多个连接(万级别)对应一个进程(高性能)

1.轻量级,采用C编写,占用更少的内存与资源 2.抗并发/高并发,以epoll and kqueue 作为开发模型,负载能力高,高并发下能够保持 低资源低消耗高性能(apache在PHP处理慢或前端压力很大时,容易出现进程数飙升 从而拒绝服务) 3.处理静态文件好,静态处理性能比apache高三倍以上 4.设计高度模块化,编写模块相对简单 5.配置简洁,正则配置更简单,且更改完可以使用 -t 测试(apache配置复杂,重启时发 现出错,会很崩溃) 6.作为负载均衡服务器,支持七层负载均衡,可以有效防止ddos攻击 7.本身是一个反向代理服务器,也可以作为邮件代理服务器使用 8.支持热部署,支持在线升级

三.安装Nginx

  1. 编译安装 关闭防火墙,将安装nginx所需软件包传到/opt目录下 nginx安装官网:https://nginx.org/en/download.html
代码语言:javascript
代码运行次数:0
运行
复制
nginx安装官网:https://nginx.org/en/download.html

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

# 将压缩包传入到/opt目录下
cd /opt
wget http://nginx.org/download/nginx-1.18.0.tar.gz

安装依赖包 #nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些安装的开发包,以便提供相应的库和头文件 yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel

创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限) useradd -M -s /sbin/nologin nginx

编译安装nginxtar xf nginx-1.18.0.tar.gz cd nginx-1.18.0/ mkdir /apps/nginx -p ./configure --prefix=/apps/nginx \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-pcre \ --with-stream \ --with-stream_ssl_module \ --with-stream_realip_module make -j2 && make install chown -R nginx.nginx /apps/nginx

创建软连接后直接 nginx启动ln -s /apps/nginx/sbin/nginx /usr/sbin/

创建Nginx 自启动文件 vim /usr/lib/systemd/system/nginx.service [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/apps/nginx/logs/nginx.pid ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target

重新加载配置、设置开机自启并开启服务 systemctl daemon-reload #重新加载配置 systemctl enable --now nginx #开机自启并立即启动 systemctl status nginx.service #查看服务状态(验证

2.yum安装 Centos7 需要安装epel源

代码语言:javascript
代码运行次数:0
运行
复制
cd /etc/yum.repos.d
vim epel.repo
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
gpgcheck=0

yum install -y epel-release

yum install nginx -y
四.Nginx的信号使用
代码语言:javascript
代码运行次数:0
运行
复制


nginx 命令支持向其发送信号,实现不同功能

nginx -h      
#查询nginx信号使用规则



常用信号:

五.Nginx的核心配置指令

代码语言:javascript
代码运行次数:0
运行
复制

1.访问状态统计配置第一步:查看已安装的 Nginx 是否包含http_stub_status模块

cd /usr/local/nginx/sbin
#根据安装路径自由修改/apps/nginx/sbin也可
nginx -V

第二步:修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置(修改之前进行备份) cd /usr/local/nginx/conf/ #/apps/nginx/conf同理 cp nginx.conf nginx.conf.bak #备份 vim nginx.conf server { listen 80; server_name www.clj.com; charset utf-8; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } ##添加 stub_status 配置 location /status { ##访问位置为/status stub_status on; ##打开状态统计功能 access_log off; ##关闭此位置的日志记录 }

第三步:重启服务后进行访问测试systemctl restart nginx.service

浏览器访问 http;//192.168.79.210/status Active connections ∶ 表示当前的活动连接数; server accepts handled requests∶表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数已处理的请求数。 可curl http∶//192.168.79.210/status 结合awk与if 语句进行性能监控。

2.基于授权的访问控制

代码语言:javascript
代码运行次数:0
运行
复制
第一步:生成用户密码认证文件
代码语言:javascript
代码运行次数:0
运行
复制

yum install -y httpd-tools
#安装工具

htpasswd -c /usr/local/nginx/passwd.db zhangsan
#生成用户密码认证文件(注意路径

chown nginx /usr/local/nginx/passwd.db 
chmod 400 /usr/local/nginx/passwd.db
#修改属性和赋予执行权限

第二步:修改主配置文件相应的目录,添加认真配置

代码语言:javascript
代码运行次数:0
运行
复制
vim /usr/local/nginx/conf/nginx.conf
#路径/apps/nginx/conf/nginx.conf

 location / {
            root   html;
            index  index.html index.htm;
            #添加认证配置
            auth_basic "secret";                    #设置密码提示框文字信息
            auth_basic_user_file /usr/local/nginx/passwd.db;
        }

第三步:检查错误,重启服务,访问测试

代码语言:javascript
代码运行次数:0
运行
复制
nginx -t
systemctl restart nginx.service 
curl 192.168.79.210

3.基于客户端访问控制

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
复制
访问控制规则如下:deny IP/IP段:拒绝某个IP或IP段的客户端访问。
代码语言:javascript
代码运行次数:0
运行
复制
allow IP/IP段:允许某个IP或IP段的客户端访问。规则从上往下执行,
代码语言:javascript
代码运行次数:0
运行
复制
如果匹配到则停止,不会再往下继续匹配。
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
复制
第一步:在主配置文件中添加控制规则

vim /usr/local/nginx/conf/nginx.conf
#注意路径/apps/nginx/conf/nginx.conf

        location / {
            root   html;
            index  index.html index.htm;
            auth_basic "secret";
            auth_basic_user_file /usr/local/nginx/passwd.db;

            # 添加控制规则
            deny 192.168.80.77;                    #拒绝访问的客户端IP
            allow all;                            #允许其他所有客户端访问
        }

第二步:重启服务

代码语言:javascript
代码运行次数:0
运行
复制
systemctl restart nginx.service 

第三步:被拒绝的客户端访问测试

代码语言:javascript
代码运行次数:0
运行
复制
192.168.79.220访问
curl 192.168.79.210

第四步:其他客户端访问测试

代码语言:javascript
代码运行次数:0
运行
复制
192.168.79.210访问
curl 192.168.79.210

192.168.79.230访问
curl 192.168.79.210

4.基于域名的nginx虚拟主机

代码语言:javascript
代码运行次数:0
运行
复制
第一步:为虚拟主机提供域名和IP的映射
代码语言:javascript
代码运行次数:0
运行
复制

echo "192.168.79.210 www.zhuo.com www.xunizhuo.com" >> /etc/hosts

第二步:为虚拟主机准备网页文档

代码语言:javascript
代码运行次数:0
运行
复制

mkdir -p /var/www/html/zhuo/
mkdir -p /var/www/html/xunizhuo/
echo "<h1>www.zhuo.com</h1>" > /var/www/html/zhuo/index.html
echo "<h1>www.xunizhuo.com</h1>" > /var/www/html/xunizhuo/index.html

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
复制
第三步:还原nginx主配置文件
代码语言:javascript
代码运行次数:0
运行
复制

之前做过访问控制,所以直接将备份配置进行还原

cd /usr/local/nginx/conf           #/apps/nginx/conf路径同理 
cp nginx.conf.bak nginx.conf       #还原主配置文件
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
复制
第四步:修改主配置文件
代码语言:javascript
代码运行次数:0
运行
复制

vim /usr/local/nginx/conf/nginx.conf
#/apps/nginx/conf/nginx.conf同理

    server {
        listen       80;
        server_name  www.xunizhuo.com;                        #设置域名           
        charset utf-8;                                    #设置网页字符集
        access_log  logs/xunizhuo.com.access.log;            #设置日志名
        location / {
            root   /var/www/html/xunizhuo;                    #设置www.bxb.com的工作目录
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;            
        server_name  www.zhuo.com;                        #设置域名
        charset utf-8;                                    #设置网页字符集
        access_log  logs/zhuo.com.access.log;            #设置日志名
        location / {
            root   /var/www/html/zhuo;                    #设置www.bxb.com的工作目录
            index  index.html index.htm;
        }

第五步:重启nginx后进行访问测试

代码语言:javascript
代码运行次数:0
运行
复制


systemctl restart nginx.service
curl www.zhuo.com
curl www.xunizhuo.com 

5.基于IP的nginx虚拟主机

第一步:添加虚拟网卡,修改主配置文件

代码语言:javascript
代码运行次数:0
运行
复制
ifconfig ens33:0 192.168.79.211/24

vim /usr/local/nginx/conf/nginx.conf
#/apps/nginx/conf/nginx.conf同理

    server {
        listen       192.168.79.210:80;                #修改监听的为ip
        server_name  www.xunizhuo.com;
        charset utf-8;
        access_log  logs/xunizhuo.com.access.log;
        location / {
            root   /var/www/html/xunizhuo;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       192.168.79.211:80;                #修改监听的为ip
        server_name  www.zhuo.com;
        charset utf-8;
        access_log  logs/zhuo.com.access.log;
        location / {
            root   /var/www/html/zhuo;
            index  index.html index.htm;
        }

第二步:检查配置文件,重启服务

代码语言:javascript
代码运行次数:0
运行
复制
nginx -t
systemctl restart nginx.service

第三步:客户端上访问测试

代码语言:javascript
代码运行次数:0
运行
复制
curl 192.168.79.210:80
curl 192.168.79.211:80

6.基于端口的nginx虚拟主机

第一步:修改主配置文件

代码语言:javascript
代码运行次数:0
运行
复制
vim /usr/local/nginx/conf/nginx.conf
#/apps/nginx/conf/nginx.conf同理

    server {
        listen       192.168.79.210:666;                #修改监听的为ip的666端口
        server_name  www.xunizhuo.com;
        charset utf-8;
        access_log  logs/xunizhuo.com.access.log;
        location / {
            root   /var/www/html/xunizhuo;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       192.168.79.211:888;                #修改监听的为ip的888端口
        server_name  www.zhuo.com;
        charset utf-8;
        access_log  logs/zhuo.com.access.log;
        location / {
            root   /var/www/html/zhuo;
            index  index.html index.htm;
        }

第二步:检查配置文件,重启服务

代码语言:javascript
代码运行次数:0
运行
复制
nginx -t
systemctl restart nginx.service

第三步:客户端上访问测试

代码语言:javascript
代码运行次数:0
运行
复制
curl 192.168.79.210:666
curl 192.168.79.211:888


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT运维技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.Nginx是什么?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档