如何快速搭建nginx服务

发布于:2024-05-04 ⋅ 阅读:(19) ⋅ 点赞:(0)

nginx简介

概念

  • nginx是一款轻量级http服务器,也是一款邮箱代理服务器,同时具备反向代理通用tcp/udp代理的功能
  • nginx可以运行在x86、ARM等多种平台上,同时支持Linux,Windows等主流的操作系统

特点

  • 支持高并发
    • 单机nginx可支持十万级的并发连接,经过优化后可最高支持百万级并发连接
  • 内存资源消耗低
    • 同级web服务器中,nginx占用的内存最少一万非活跃的http keep-alive连接仅消耗2.5M内存
  • 高扩展性
    • apache一样,nginx采用模块化设计,并支持非常丰富的第三方模块
  • 高可靠性
    • nginx采用master-worker模式,如果worker出现故障,master可以快速开启一个新的worker来提供服务

nginx框架

  • 主进程:master

    • 检查nginx配置是否正确
    • 创建、监控worker进程的数量和状态
    • 接收对nginx的管理指令,并作出对应操作
  • 工作进程:worker

    • 处理客户端请求
    • 接收master发来的指令,并做对应操作
  • 在这里插入图片描述

  • 注意:默认情况下,nginx会建立和服务器cpu核心数相等的worker进程worker进程之间相互独立若一个进程故障不会影响其他进程

nginx关键工作机制

  • 抢占机制:当客户端发起请求时,会激活accept_mutex互斥锁,哪个worker抢占了该互斥锁,该客户端的请求就由哪个worker响应和处理
  • 在这里插入图片描述
  • 异步非阻塞模式:在传统事件处理模式下,如果所有的worker被客户端阻塞后,新来的客户就需要等待,直到原来的客户端释放worker后才能被处理请求。在异步非阻塞模式下,底层使用了linux的epol模型,就算worker被阻塞,新的客户端请求也会被正常处理
  • 在这里插入图片描述

nginx正向代理功能

  • 图:

  • 在这里插入图片描述

  • 分析:它的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我,从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

  • 理解:

    • 在这里插入图片描述
    • A租房人(客户端)想租C真实房东的房子,但不认识C真实房东(服务端)
    • B房产中介(代理)认识C真实房东(服务端),并且从C真实房东(服务端)租到了房
    • A租房人(客户端)通过B房产中介(代理)租到了C真实房东(服务端)的房
    • C真实房东(服务端)只知道房子租给了B房产中介(代理),并不知道A租房人(客户端)租了自己的房子
  • 结论:正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端代理发送一个请求并指定目标(原始服务器),然后代理原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理就像要访问googleypn代理翻墙去访问(用户知道要访问真正的服务器)

nginx反向代理功能

  • 图:
  • 在这里插入图片描述
  • 分析:反向代理正好相反,它也是在客户端和服务器端的一个代理服务器,但是这个代理服务器的目的是用来保护服务器端的,当外网客户端来访问我们的服务器时为了避免暴露应用服务器的实际ip地址,我们会让客端访问代理服务器,然后代理服务器再根据客户端的请求去实际的应用服务器获取响应内容并返回客户端

nginx反向代理的工作流程

  • 1.客户端向Nginx发送请求
  • 2.Nginx在收到客户端发送的请求后,将请求转发到后端务器
  • 3.后端服务器将客户端请求的资源回复给Nginx
  • 4.Nginx将资源返回给客户端

代理本质

  • Nginx反向代理通过位于location中的proxy_pass实现
  • 在反向代理的工作流程中,客户端向代理请求资源时使用的端口可以和服务器提供服务的端口不一致
  • 在这里插入图片描述

nginx负载均衡

  • Nginx可以提供四层七层的负载均衡
  • Nginx的负载均衡功能通过位于http中的upstream实现
  • Nginx提供了多种负载均衡算法,如轮询、权重等
  • 轮询算法下,Nginx会轮流将请求发送给不同的服务器,使每个服务器都均等的提供服务
  • 权重算法下,Nginx会按照配置的权重比例,将请求发送给服务器。性能较好的服务器将提供更多的服务,性能较少的服务器将提供较少的服务
  • 在这里插入图片描述

部署nginx

[root@server ~]# setenforce 0

[root@server ~]# systemctl stop firewalld

[root@server ~]# systemctl disable firewalld

[root@server ~]# yum install nginx -y

[root@server ~]# nginx -v  #查看nginx版本,编译器,配置参数等信息
nginx version: nginx/1.20.1

[root@server ~]# systemctl start nginx

[root@server ~]# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

[root@server ~]# systemctl status nginx

[root@server ~]# ps -ef | grep nginx   # 查看nginx进程
root       32436       1  0 13:49 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx      32437   32436  0 13:49 ?        00:00:00 nginx: worker process
nginx      32438   32436  0 13:49 ?        00:00:00 nginx: worker process
root       32465    2807  0 13:49 pts/0    00:00:00 grep --color=auto nginx

[root@server ~]# netstat -lntup | grep nginx  #查看nginx端口
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      32436/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      32436/nginx: master

常用命令

systemctl系列

[root@server ~]# systemctl start nginx #启动服务

[root@server ~]# systemctl restart nginx #重启服务

[root@server ~]# systemctl enable nginx #开机启动

[root@server ~]# systemctl stop nginx #停止服务

[root@server ~]# systemctl disable nginx #取消开机启动

[root@server ~]# systemctl status nginx #查看状态

nginx自带命令

[root@server ~]# nginx   #启动nginx

[root@server ~]# nginx restart  #重启服务

[root@server ~]# nginx -s reload  #重新加载配置文件

[root@server ~]# nginx -s stop  #强行停止服务

[root@server ~]# nginx -s quit  #优雅停止服务,即所有请求处理完后退出服务

[root@server ~]# nginx -v  #查看版本号

[root@server ~]# nginx -t  #检查配置文件的语法是否错误,无错返回ok

nginx配置文件

[root@server ~]# cd /etc/nginx  #服务目录

[root@server nginx]# tree
.
├── conf.d    #子配置文件目录
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── koi-utf    #KOI8-R 编码(俄语)转换的映射文件
├── koi-win    #KOI8-R 编码(俄语)转换的映射文件
├── mime.types   #配置支持的媒体类型
├── mime.types.default  #样例文件
├── nginx.conf   #主配置文件
├── nginx.conf.default   #样例文件
├── scgi_params
├── scgi_params.default
├── uwsgi_params
├── uwsgi_params.default
└── win-utf   #KOI8-R 编码(俄语)转换的映射文件
网页默认目录:/usr/share/nginx/html
访问日志:/var/log/nginx/access.log
错误日志:/var/log/nginx/error.log

主配置文件/etc/nginx/nginx.conf

[root@server ~]# vim /etc/nginx/nginx.conf

内容结构

  • 全局配置

    • 运行用户
    • worker数量
    • 日志参数
    • include导入的外部配置文件
  • 性能配置

    • 工作模式
    • TCP连接数
  • http模块配置

    • http请求和响应的参数
    • 路由配置
    • 虚拟主机配置
    • 反向代理配置
    • 负载均衡配置

在这里插入图片描述

模块分析

  • 层级结构图
  • 在这里插入图片描述

配置分析

# main配置段(全局配置)
user nginx;  #运行的账户,默认即是nginx,可以不进行设置
worker_processes auto;  #worker进程数,根据硬件调整,通常等于CPU数量或者2倍于CPU
error_log /var/log/nginx/error.log;  #错误日志存放目录
pid /run/nginx.pid; #指定运行Nginx master主进程的pid文件存放路径

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;  #导入的外部文件位置


#events配置段,性能模块设置,其中可以设置时间处理模式等
events {
	use epoll; #使用epo11事件驱动模型,但不推荐配置它,让nginx自己选择
    worker_connections 1024; #每个进程的最大连接数量(并发数)
    accept_mutex on  #默认是off关闭的,这里推荐打开
}


#http配置段,包含全局块和server块,使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {
    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  /var/log/nginx/access.log  main; #访问日志存储位置

    sendfile            on; #高效文件传输模式,默认开启
    tcp_nopush          on; #性能优化参数,数据是否立刻发送
    tcp_nodelay         on; #性能优化参数,小数据包是否延迟发送
    keepalive_timeout   65; #超时时间
    types_hash_max_size 4096; #性能优化参数,影响散列表的冲率

    include             /etc/nginx/mime.types; #可解析的静态资源类型 
    default_type        application/octet-stream; #默认文件类型

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;  #加载子配置项


	#server配置段,虚拟主机设置
    server {
        listen       80; #监听IPV4端口
        listen       [::]:80; #监昕IPV6端口
        server_name  _; #访问的域名
        root         /usr/share/nginx/html; #网页默认目录

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf; #子配置文件存储路径
       

		#1ocation配置段,一般用来匹配不同的URI请求
		location / {
			root    /usr/share/nginx/html;  #相对路径网站根目录
			alias   /usr/share/nginx/html/; #绝对路径网站根目录
			index index.html index.htm; #默认首页文件
			
			deny 172.168.22.11;  #禁止访问的ip地址,可以为a11
			allow 172.168.33.44;  #允许访问的ip地址,可以为a11
			autoindex on;  #开启目录文件列表
			autoindex_exact_size on; #显示出文件的确切大小,单位是bytes
			autoindex_localtime on; #显示的文件时间为文件的服务器时间
			charset utf-8,gbk; #避免中文乱码
			auth_basic "xxxx";  #加密网页验证时的提示信息
			auth_basic_user_file   /路径/文件名; #加密网页使用的密码验证文件
		}
		
		 error_page 404 /404.html;  #404时返回给客户端的页面
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html; #50x错误返回给客户端的页面
        location = /50x.html {
        }
    }



#https虚拟主机定义
# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;  #监听的IPV4端口
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;   #网页默认目录
#
#        ssl_certificate "/etc/pki/nginx/server.crt";  #证书存储路径
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";  #密钥存储
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }
}

注意

  • server_name指令一般用于指定虚拟主机的域名,在匹配时有以下四中写法:
    • 精确匹配:server_name http://www.nginx.com;
    • 左侧匹配:server_name *.http://nginx.com;
    • 右侧匹配:server_name http://www.nginx.*;
    • 正则匹配:server_name ~^www.nginx.*$;
  • 注:匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
  • root指令与alias指令区别
    • root指令用于静态资源目录位置,它可以写在http、server、location等配置中,root指令定义的路径会与URI叠加产生最终访问路径,如:
location /image {
	root  /opt/nginx/static;
}

#当用户访问www.test.com/image/1.png时,实际在服务器找的路径是/opt/nginx/static/image/1.png
  • alias也是指定静态资源目录位置,但只能访问指定的绝对路径,不会叠加目录,只能写在location中且末尾一定要添加 /,如:
location /image {
	alias  /opt/nginx/static/image/;
}

#当用户访问www.test.com/image/1.png时,实际在服务器找的路径是/opt/nginx/static/image/1.png
  • location匹配路径
    • 格式:
location [ = | ~ | ~* | ^~ ] uri {
	......
}
  • 匹配规则:
    • = 精确匹配
    • ~ 正则匹配,区分大小写
    • ~* 正则匹配,不区分大小写
    • ^~ 匹配以某个字符串开头,不是正则匹配
    • / 通用匹配,如果其他location都没有匹配,则该location会进行匹配
  • 匹配优先级:= ^~ ~ ~* 不带任何字符
示例
server {
	listen  80;
	server_name  www.nginx-test.com;
	
	#只用当访问www.nginx-test.com/match_all/ 时才会匹配到 /usr/share/nginx/html/match_all/index.html
	location = /match_all/ {
		root  /usr/share/nginx/html;
		index index.html;
	}

	#当访问 www.nginx-test.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源
	location ~ \.(jpeg|jpg|png|svg)$ {
		root  /usr/share/nginx/images;
	}

	#当访问www.nginx-test.com/bbs 时会匹配上 /usr/share/nginx/html/bbs/index.html
	location ^~ /bbs/ {
		root  /usr/share/nginx/html;
		index index.html index.htm;
	}


	#注意:上述location都找不到的话都在这里找
	location / {
		root html;
		index index.html index.htm;
	}
	#其/不是根目录而是统统都匹配到指定路径,而指定路径为html,即nginx的默认网页目录/usr/share/nginx/html
}
  • uri中的斜线,如;
location /test {  #尾部无/
	......
}


location /test/ {  #尾部有/
	......
}
  • 不带/ 当访问http://www.nginx-test.com/test 时,nginx先找是否有test目录,如果有,则找test目录下的index.html;如果没有test目录,nginx则会找是否有test文件
  • / 当访问http://www.nginx-test.com/test 时,nginx先找是否有test目录,如果有则找test目录下的index.html,如果没有它也不会去找是否存在test文件

nginx.conf配置文件的语法规则

  • 配置文件由指令指令块构成
  • 每条指令以;分号结尾,指令与参数间以空格符号分隔
  • 指令块以 {} 大括号将多条指令组织在一起
  • include 语句允许组合多个配置文件以提升可维护性
  • 通过 # 符号添加注释,提高可读性
  • 通过$符号使用变量
  • 部分指令的参数支持正则表达式,例如常用的location指令

实验1:快速搭建网站

[root@server ~]# yum install nginx -y

[root@server ~]# systemctl start nginx

[root@server ~]# echo "welcome to www.openlab.com" > /usr/share/nginx/html/index.html  #写入网页数据

#使用windows端进入访问

在这里插入图片描述

实验2:替换网页目录

[root@server ~]# yum install nginx -y

[root@server ~]# systemctl start nginx

[root@server ~]# mkdir -p /www/sxhkt  #创建网页目录

#使用mobaxterm上传网页数据到/www/sxhkt中

[root@server ~]# cd /www/sxhkt

[root@server sxhkt]# ls
CSS  img  index.html  js

[root@server sxhkt]# vim /etc/nginx/nginx.conf
#定位到42行,修改如下:
root    /www/sxhkt;

[root@server sxhkt]# systemctl restart nginx

#测试:打开Windows端输入IP地址

在这里插入图片描述

实验3:搭建location板块的网站

[root@server ~]# yum install nginx -y

[root@server ~]# systemctl start nginx

[root@server ~]# mkdir -p /www/sxhkt  #创建网页目录

#使用mobaxterm上传网页数据到/www/sxhkt中

[root@server ~]# cd /www/sxhkt

[root@server sxhkt]# ls
CSS  img  index.html  js

[root@server sxhkt]# vim /etc/nginx/nginx.conf
#server板块中添加location板块
server{
	listen    80;
	listen    [::]:80;
	server_name  _;
	
	location / {
		root   /www/sxhkt;
		index index.html index.htm;
	}
}


[root@server sxhkt]# systemctl restart nginx

#测试:打开Windows端输入IP地址

在这里插入图片描述

实验4:搭建带有密码验证访问的网站数据列表

  • 准备工作
[root@server ~]# setenforce 0

[root@server ~]# systemctl stop firewalld

[root@server ~]# systemctl disable firewalld

[root@server ~]# yum install nginx -y

[root@server ~]# yum install httpd-tools -y  

[root@server ~]# systemctl start nginx

[root@server ~]# systemctl enable nginx
  • 新建账户
[root@server ~]# useradd test1
[root@server ~]# useradd test2
[root@server ~]# passwd test1
更改用户 test1 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]# passwd test2
更改用户 test2 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
  • 增加密码访问控制htpasswd
[root@server ~]# htpasswd -c /etc/nginx/passwd test1
New password:           #密码:12345
Re-type new password:   
Adding password for user test1


[root@server ~]# htpasswd /etc/nginx/passwd test2
New password:        #密码:12345
Re-type new password:
Adding password for user test2


# htpasswd:生成密码数据的命令
# -c:表示第一次生成,会创建存储密码的文件,第二次创建密码时不能增加-c参数,否则会覆盖
# /etc/httpd/passwd:存储访问网站的密码文件,passwd为文件名,名称可以自定义
# test1:需要验证密码访问的账户名称
  • 开启访问网站时需要验证密码
[root@server ~]# vim /etc/nginx/nginx.conf
server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/log;   #数据列表
        
        autoindex     on;    #开启访问网站时需要验证密码
        auth_basic    "请输入密码";  #提示语
        auth_basic_user_file    /etc/nginx/passwd;   #对比的密码文件库
  • 重启服务,测试
[root@server ~]# systemctl restart nginx

#windows打开浏览器输入IP地址,进行测试

在这里插入图片描述

  • 输入用户名和密码
    在这里插入图片描述

网站公告

今日签到

点亮在社区的每一天
去签到