尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Nginx 从入门到精通:一站式 Web 服务器实战指南

Nginx 从入门到精通:一站式 Web 服务器实战指南 nginx 服务介绍HTTP 概述HTTP 全称是 HyperText Transfer Protocal即超文本传输协议从 1990 年开始就在 WWW 上广泛应用是现今在 WWW 上应用最多的协议HTTP 是应用层协议当你上网浏览网页的时候浏览器和 web 服务器之间就会通过 HTTP 在 Internet 上进行数据的发送和接收。HTTP 协议是基于 TCP/IP 协议之上的应用层协议。请求必定由客户端 发出而服务器回复响应♦HTTP特点简单快速用户向服务器请求服务时只要传送请求方法和路径。因为 HTTP 协议简单使得 HTTP 服务器的程序规模小因此通信速度很快。灵活HTTP 允许传输任意类型的数据对象无连接无连接的含义是限制每次链接只解决一个请求服务器解决完用户的请求,并收到用户的应答后即断开链接采用这种方式可以节省传输时间无状态HTTP 协议是无状态协议。无状态是指协议对于事物解决没有记忆能力。缺少状态意味着假如后续解决需要前面的信息则它必需重传这样可能会导致每次连接传送的数据量增大。另一方面在服务器不需要先前信息时它的应答就比较快HTTP 协议自身不具备保存之前 发送过的请求或响应的功能♦ URL介绍URL(Uniform Resource Locator)是统一资源定位符的简称有时候也被俗称为网页地址(网址),好像是网络上的门牌是因特网上标准的资源的地址通用的格式♦响应状态码常见的状态码状态码对应的信息1xx提醒信息一表示请求已接收,继续解决2xx用于表示请求已被成功接收、了解、接收3xx用于表示资源(网页等)被永久转移到其它URL,也就是所谓的重定向4xx用户端错误一请求有语法错误或者者请求无法实现5xx服务器端错误-服务器未能实现合法的请求nginx服务介绍♦ nginx简介Nginx 读作 “engine-ex”Nginx 是由俄罗斯程序员 Igor Sysoev 编写2004年10月作为一个试图回答公众发布 C10K 问题其中 C10k 是同时管理 10,000 个连接的挑战。Nginx 采用了事件驱动和异步架构此设计使 Nginx 成为可扩展 高性能的服务器。它是一个开源、轻量级和高性能的 Web 服务器也用作 HTTP、HTTPS、SMTP、IMAP、POP3 协议的反向代理服务器另一方面它也用作 IMAP、POP3 和 IMAP 的 HTTP 负载均衡器、HTTP 缓存和电子邮件代理。nginx 的安装与使用安装 nginx方式一yum安装安装epel源yum-yinstallepel-release安装nginx软件包yum-yinstallnginx启动服务systemctl start nginx查看版本nginx-v测试访问方式二源码安装环境准备卸载其他方式安装的web应用防止端口冲突下载nginx源码包wgethttp://nginx.org/download/nginx-1.22.1.tar.gz源码编译安装yuminstall-ygcc pcre-devel zlib-devel# 安装依赖包useradd-M-s/sbin/nologin nginx# 创建程序运行用户和组tar-axfnginx-1.22.1.tar.gz# 解包cd~/nginx-1.22.1 ./configure--prefix/usr/local/nginx--usernginx--groupnginx# 配置说明–prefix/usr/local/nginx #指定安装目录–usernginx --groupnginx #指定程序运行的用户和组makemakeinstall#编译安装4启动服务防火墙放行/usr/local/nginx/sbin/nginxnetstat-tunlp|grepnginx firewall-cmd--zonepublic --add-port80/tcp--permanentfirewall-cmd--reload5命令路径优化vim/etc/profile.d/nginx.shexportPATH/usr/local/nginx/sbin:$PATHsource/etc/profile#立即生效6设置开机自启动echo/usr/local/nginx/sbin/nginx/etc/rc.d/rc.localchmodx /etc/rc.d/rc.local♦ 服务管理Nginx运行时分为一个nginx: master process主进程和若干个 nginxworker process 工作进程ps-Cnginx-opid,ppid,command启动nginx或nginx-c/usr/local/nginx/conf/nginx.conf快速关闭pkill-9nginx或者nginx-sstop重载nginx-sreload优雅的关闭nginx-squit或者kill-QUITnginx主进程号♦ 服务管理nginx命令其他常用选项:-c /path/to/config 为 Nginx 指定一个配置文件,来代替缺省的-t 不运行,而仅仅测试配置文件nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件-v 显示 nginx 的版本-V 显示 nginx 的版本,编译器版本和配置参数主程序可以处理以下信号:TERM, INT快速关闭QUIT从容关闭HUP重载配置 用新的配置开始新的工作进程 从容关闭旧的工作进程USR1重新打开日志文件USR2平滑升级可执行程序。WINCH从容关闭工作进程升级安装 nginx场景添加功能模块查看当前安装配置信息nginx-V2重新配置cd~/nginx-1.22.1makeclean# 清除之前编译的文件# 添加ssl安全加密功能 with-http_ssl_module模块./configure--prefix/usr/local/nginx--usernginx--groupnginx --with-http_ssl_modulemakemakeinstall版本升级不能执行makeinstall只需替换编译好的nginx可执行文件makeupgrade#执行平滑升级./configure--prefix/usr/local/nginx--usernginx--groupnginx --with-http_ssl_module --with-http_realip_modulenginx 配置文件介绍主配置文件:/usr/local/nginx/conf/nginx.confnginx常见的配置文件及其作用:配置文件作用nginx.confnginx的基本配置文件mime.typesMIME类型关联的扩展文件fastcgi.conf与fastcgi相关的配置proxy.conf与proxy相关的配置sites.conf配置nginx提供的网站,包括虚拟主机常见的配置文件及其作用实战配置案例下面是一个简单的静态网站配置示例展示了如何配置一个基本的 Nginx 服务器块server block# 简单的静态网站配置示例 server { # 监听端口 listen 80; # 服务器名称域名 server_name example.com www.example.com; # 网站根目录 root /var/www/example.com; # 默认索引文件 index index.html index.htm; # 访问日志配置 access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; # 主 location 块 location / { # 尝试按顺序查找文件 try_files $uri $uri/ 404; } # 静态文件缓存配置 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control public, immutable; } # 禁止访问隐藏文件 location ~ /\. { deny all; access_log off; log_not_found off; } }配置说明server 块定义一个虚拟主机可以包含多个 server 块来服务不同的网站。listen 指令指定 Nginx 监听的端口这里监听 80 端口HTTP。server_name 指令指定服务器响应的域名可以配置多个域名用空格分隔。root 指令设置网站的根目录所有请求的文件都将从这个目录中查找。index 指令指定默认的索引文件当访问目录时Nginx 会按顺序查找这些文件。access_log 和 error_log 指令access_log记录所有访问日志error_log记录错误日志日志路径可以根据实际需求调整。location 块location /匹配所有请求使用try_files指令尝试查找文件location ~* \.(jpg|jpeg|png|gif|ico|css|js)$匹配静态文件设置缓存时间location ~ /\.禁止访问以点开头的隐藏文件使用步骤创建网站目录sudomkdir-p/var/www/example.com创建测试页面sudoechoh1Welcome to Example.com/h1/var/www/example.com/index.html将配置文件保存到/etc/nginx/sites-available/example.com或/usr/local/nginx/conf.d/example.com.conf创建符号链接如果使用 sites-available/sites-enabled 结构sudoln-s/etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/测试配置语法sudonginx-t重载 Nginx 配置sudonginx-sreload访问测试在浏览器中访问http://example.com或使用 curlcurlhttp://localhost这个配置示例展示了 Nginx 配置的基本结构可以根据实际需求进行调整和扩展。nginx 虚拟主机配置虚拟主机配置虚拟主机概念虚拟主机就是把一台物理服务器划分成多个 “虚拟” 的服务器这样我们的一台物理服务器就可以当做多个服务器来使用从而可以配置多个网站。Nginx 提供虚拟主机的功能就是为了让我们不需要安装多个 Nginx就可以运行多个域名不同的网站。每台虚拟主机都可以是一个独立的网站可以具有独立的域名具有完整的 Intemet 服务器功能WWW、FTP、Email等同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看每一台虚拟主机和一台独立的主机完全一样。Nginx 下一个 server 标签就是一个虚拟主机。nginx 的虚拟主机就是通过主配置文件 nginx.conf 中 server 节点指定的想要设置多个虚拟主机配置多个server节点即可。虚拟主机实现方式配置虚拟主机有三种方法基于域名的虚拟主机 不同的域名、相同的IP此方式应用最广泛。基于IP地址的虚拟主机 不同的域名、不同的IP 基于IP地址。基于端口的虚拟主机 不使用域名、IP来区分不同站点的内容而是用不同的TCP端口号。方式一基于相同 IP 不同端口创建两个网站的根目录mkdir/www01mkdir/www02echothis is web1/www01/index.htmlechothis is web2/www02/index.html修改主配置include /usr/local/nginx/conf.d/*.conf;# (添加在http块里面)nginx-t# 修改完后用该命令去检查语法nginx-sreload# 重载配置 servermkdir/usr/local/nginx/conf.dvim/usr/local/nginx/conf.d/web1.confvim/usr/local/nginx/conf.d/web2.conf测试方式二基于相同端口号不同 IPvim/usr/local/nginx/conf.d/web1.confvim/usr/local/nginx/conf.d/web2.conf重载nginx-sreload临时添加 IP地址测试重启失效ipaddradd192.168.19.10/24 dev ens160ipaddradd192.168.19.20/24 dev ens160永久添加 IP# 查看当前网卡名称nmcli device status# 为 ens160 网卡添加辅助IP假设网卡名为 ens160nmcli connection modify ens160 ipv4.addresses192.168.19.20/24 nmcli connection up ens160测试方式三基于不同主机名vim/usr/local/nginx/conf.d/web1.confvim/usr/local/nginx/conf.d/web2.confnginx-sreload修改本地hosts文件测试echo192.168.19.128 www.web1.com www.web2.com/etc/hostsnginx 常用命令介绍指令介绍Nginx 中的配置选项称为指令该选项有名称和参数,必须以分号 ( 结尾,否则 Nginx 将无法加载配置并产生错误例子listen 80;常用指令常用指令root 指令与 alisa 指令指令All Wherehttpserverlocationif in location功能简介root✓✓✓✓指定: 主目录alias✓设置: 别名路径root指令的语法: root directory-path;root指令的功能目的用于设置网站主目录root 指令的工作机制将访问的urI路径追加到指定的文件目录路径之后然后读取文件数据例如:root /usr/local/nginx/html;访问http://www.test.com/dir01/pic/1.jpg图解alias别名路径/虚拟目录指令alias 指令的语法: alias file- path | directory-path;alias 别名路径指令的功能目的: 用于设置引导匹配的 URL 访问请求去访问指定物理路径的目录或文件隐藏真实的数据路径alias别名路径指令的工作机制将 location URI 路径的匹配部分替换为指定的文件目录路径然后读取文件数据例如:location /dir01/pic{alias/data/dir01;}Location指令location 是 Nginx 中的块级指令(block directive)location 指令的功能是用来匹配不同的 url 请求进而对请求做不同的处理和响应语法: location[ |^~ | ~ | ~| ]/uri/ {…}*允许在 location 配置段中使用 root 指令来指定主目录允许在 location 配置段中使用 alias 指令来指定别名路径语法解析:Location指令的多种 URL 匹配方式/uri/是一个正则表达式就是用来匹配客户端 http 访问目录路径前缀是无||~| ~*| ^~ | 用于定义不同的URL匹配方式无前缀表示执行基于普通字符的URI前缀匹配必须以/开头不支持正则表达式的元字符。前缀表示:执行基于普通字符的URI精准匹配必须以/开头不支持正则表达式的元字符。前缀^~表示:执行基于普通字符的URI前缀匹配必须以/开头不支持正则表达式的元字符。注意: location ^~和无前缀两者之间不要一模一样否则会提示配置错误。前缀~表示执行基于正则表达式的URI正则匹配支持正则表达式的元字符区分大小写。前缀~*”表示执行基于正则表达式的URI正则匹配支持正则表达式的元字符不区分大小写。前缀表示一个独立的location类别既不是普通 location, 也不是正则 location, 而是一个命名 location。命名 location 不是用来处理 HTTP request 客户端请求而是用于服务端的一个 forward 内部重定向中。无任何前缀不加任何规则时默认是大小写敏感前缀匹配例location /index/ {…}#http://abc.com/index [匹配成功]#http://abc.com/index/index.page [匹配成功]#http://abc.com/test/index [匹配失败]#http://abc.com/Index [匹配失败]“”精确匹配 内容要同表达式完全一致才匹配成功例:location /abc/ {}# 只匹配http://abc.com/abc#http://abc.com/abc [匹配成功]#http://abc.com/abc/index [匹配失败]3、“^~”普通匹配表示普通字符串匹配上以后不再进行正则匹配例location ^~ /index/ {…}#以 /index/ 开头的请求都会匹配上#http://abc.com/index/index.page [匹配成功]#http://abc.com/error/error.page [匹配失败]注意从上往下依次匹配匹配上以后不再进行正则匹配“~”正则匹配表示执行正则匹配区分大小写。例location ~ /Abc/ {…}#http://abc.com/Abc/ [匹配成功]#http://abc.com/abc/ [匹配失败]“~*”正则匹配表示执行正则匹配忽略大小写。例location ~* /Abc/ {…}则会忽略 uri 部分的大小写#http://abc.com/Abc/ [匹配成功]#http://abc.com/abc/ [匹配成功]“”前缀nginx内部跳转例location /index/ {error_page 404 index_error;}location index_error {…}#以 /index/ 开头的请求如果链接的状态为 404。则会匹配到 index_error 这条规则上。匹配优先级①location 一一一②location^~和无前缀— -③location或*nginx 访问控制用户验证Basic 基本验证创建 http 虚拟用户yuminstallhttpd-tools-ypassdir/usr/1ocal/nginx/passwdmkdir-p${passdir}# 创建: 用户basic验证文件的存储目录htpasswd-b-c${passdir}/basic_password user01123# 创建:第一个nginx basic基本验证用户说明-c 表示:创建一个新的用户basic验证文本文件名为: /etc/httpd/passwd/basic_ password-b 表示:使用命令行的密码htpasswd-b${passdir}/basic_password user02123# 创建第二用户无需-c选项2.配置nginx basic基本验证基本指令准备数据mkdir/vhost{01..02}echoThis is vhost01/vhost01/index.htmlechoThis is vhost02”/vhost02/index.html创建测试虚拟主机mkdir-p/usr/local/nginx/conf.dcat/usr/local/nginx/conf.d/vhost.confE0F server{listen80;server_name www01.test.com;auth_basicNginx access control for server;auth_basic_user_file /usr/local/nginx/passwd/basic_password;location /{root /vhost01;index index.html index.htm;}}server{listen80;server_name www02.test.com;auth_basicNginx access control for server!!!;auth_basic_user_file /usr/local/nginx/passwd/basic_password;location /{root /vhost02;index index.html index.htm;}}EOF在 Windows 上访问需修改 hosts访问控制命令基于客户端地址的访问控制Nginx 中提供了两个用于配置访问权限控制的指令,分别为 allow 和 deny 从其名称就可以看出, allow 用于设置 允许访问的权限 deny 用于设置禁止访问的权限 在使用时, 权限指令后只需跟上允许或禁止的 IPIP 段或 all 即 可 其中,all 表示所有的 例:server { listen 80; server_name localhost; root html; index index.html index.htm; deny all; }说明此配置用于禁止所有的客户端访问权限控制指令的使用虽然简单但是在设置的过程中还需要特别注意以下几个点。单个 IP 指定作用范围最小 all 指定作用范围最大。同一块下若同时存在多个权限指令deny、allow 则先出现的访问权限设置生效 并且会对后出现的设置进行覆盖未覆盖的范围依然生效否则以先出现的设置为准当多个块如 http、server、 location中都出现了权限设置指令则内层块中的权限级别要比外层块中设置的权限级别高 。例server { listen 80; server_name localhost; root html; index index.html index.htm; allow 192.168.100.100 deny all; }nginx 常用模块介绍重定向模块重定向概念重定向指的是当用户访问某个URL时服务器将该URL重定向到另外一个URL的过程。重定向可以帮助我们更好的管理网站内容优化SEO效果提升用户体验等。Nginx中提供了多种重定向方式包括301重定向、302重定向、rewrite重定向等。重定向基本语法rewrite是实现URL重写的关键指令根据regex (正则表达式)部分内容,重定向到replacement结尾是flag标记。语法rewrite [flag];说明regex: 正则表达式语句进行规则匹配replacement: 将正则匹配的内容替换成replacementflag: last | break | redirect | permanentlast : 本条规则匹配完成后继续向下匹配新的location URI规则break: 本条规则匹配完成即终止不再匹配后面的任何规则redirect : 回302临时重定向浏览器地址会显示跳转后的URL地址 (防爬虫)permanent : 返回301永久重定向浏览器地址栏会显示跳转后的URL地址rewrite 使用的位置server : 在server中针对所有的请求location : 在 location 中则针对 单个匹配路径的If使用if指令进行判断server 中使用 rewrite例server { listen 80; server_name www.yjs.com;# 由于是外部站点带https 的 所以不受flag 影响 break last 都会进行跳转并且变更浏览器url rewrite ^/(.*)$ https://www.baidu.com break; location / { root html; index index.html; } }也可以部分请求转发server { listen 80; server_name www.yjs.com; # 只有当后缀是 数字.html 的时候才会转发到 https://www.baidu.com rewrite ^/([0-9]).html$ https://www.baidu.com break; # 其他的请求会走到这个location中 location / { root html; index index.html; } }重定向到站内资源rewrite 到内部站点是指 replacement 不带http/https 而是内部的另外一个路径 , 相当于访问隐藏起来的这个内部路径。例server { listen 80; server_name www.yjs.com; rewrite ^/([0-9]).html$ /my.gif break; #其他的请求会走到这个location中 location / { root html; index index.html; } # 上面的rewrite 会被路由到这里 location /my.gif { root /www/static/; # 文件存放路径/www/static/my.gif } }location 中使用 rewritelocation 中也可以使用 rewrite 意思是只有匹配到 这个location 后再经过 rewrite 的正则通过后才能跳转。例server { listen80; server_name www.yjs.com; #rewrite ^/([0-9]).html$ /my.gif last; location /my.gif { rewrite ([0-9]).html$ https://www.baidu.com last; } location / { roothtml; index index.html index.htm; } }if 中使用 rewrite例server { listen80; server_name www.yjs.com; location / { root/usr/local/nginx/test; if ( !-e $request_filename ) { rewrite ^/.* http://www.baidu.com redirect; } } }mkdir/usr/local/nginx/testechoh1this is test/h1/usr/local/nginx/test/index.html说明结合 if 指令来对 nginx 请求进行判断若访问 http://www.yjs.com 的资源存在root目录则返回若当前请求的资源文件不存在则进行重定向跳转。了解常用的全局变量$args # 该变量中存放了请求 URL 中的请求指令同 $query_string;$content_length # 该变量中存放了 HTTP 请求头中的Content-length段;$content_type # 该变量中存放了HTTP 请求中的Content-type段 $document_root #该变量中存放了针对当前请求的根路径。$document_uri #该变中存放了请求的当前URI但是不包括求指令;$host #变量中存放了请 URL 的主机部分如果请求中没有 Host 行则等于设置的服务器名$http_host # 该变里与 $host 唯一区别带有端口号;$http_user_agent #该变量中存放客户端的代理信息;$http_cookie # 该变量中存放客户端的 cookie 信息。$limit_rate #对连接速率的限制;$request_method # 请求的方法比如GET、POST等;$remote_addr # 该变量中存放客户端的地址;$remote_port # 该变量中存放了客户端与服务器建立连接的端口号;$remote_user #该变量中存放客户端的用户名认证用;$request_filename #该变中存放了当前请求的资源文件的路径名;$request_body_file 该变量中存放了发给后端服务器的本地文件资源的名称;$request_method 该变量中存放客户端的请求方式比如’GET’、POST’等。$request_uri 该变量中存放了当前请求的 URI并且带请求指令即带查询字符串不包含主机名如: “/foo/bar.php?argbaz”;$query_string # 与 $args 相同;$scheme # 该变量中存放了客户端请求使用的协议比如 http 或是 https;$server_protocol # 该变量中存放了客户端请求协议的版本,“HTTP/1.0或HTTP/1.1”;$server_addr # 服务器地址如果没有用 listen 指明服务器地址使用这个变量将发起一次系统调用以取得地址(造成资源浪费);$server_name # 请求到达的服务器名;$server_port # 请求到达的服务器端口号;$uri # 请求的URI可能和最初的值有不同比如经过重定向之类的。压缩模块Nginx中的Gzip模块支持在线实时压缩输出数据流。有利于减少访问网站过程中传输的数据量从而减少带宽资源的占用率。指令详解gzip语法: gzip on | off 开启或者关闭gzip模块默认值: gzip off作用域: http, server, location, if (x) locationgzip_buffers语法: gzip_buffers number size 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流默认值: gzip_buffers 4 4k/8k作用域: http, server, locationgzip_comp_level语法: gzip_comp_level 1…9 gzip压缩比1 压缩比最小处理速度最快9 压缩比最大但处理最慢传输快但比较消耗cpu。默认值: gzip_comp_level 1作用域: http, server, locationgzip_min_length语法: gzip_min_length length默认值: gzip_min_length 0作用域: http, server, location设置允许压缩的页面最小字节数页面字节数从header头中的Content-Length中进行获取。默认值是 0不管页面多大都压缩。建议设置成大于1k的字节数小于1k可能会越压越大。即: gzip_min_length 1024gzip_types语法: gzip_types mime-type [mime-type …]默认值: gzip_types text/html作用域: http, server, location匹配MIME类型进行压缩无论是否指定”text/html”类型总是会被压缩的。使用范例gzip on; gzip_min_length 1000; gzip_buffers 4 4k; gzip_comp_level 4; gzip_types text/plain application/xml;vim /usr/local/nginx/conf/nginx.conf测试curl-I-HAccept-Encoding: gziphttp://server/*.html
返回列表