文章目录前提安装启动源码安装安装依赖yum源安装操作命令配置自启动配置功能location语法目录浏览/下载指定类型强制下载访问控制虚拟主机反向代理HTTPS负载均衡超时与失败切换限流与防刷压缩日志WebSocket 支持安全响应头监控与状态页前提● Web 服务 (Web Service)这是一个大类别。指的是任何通过网络通常是互联网为其他设备提供服务的技术。● HTTP 服务HyperText Transfer Protocol Service这是 Web 服务中最主流的实现方式。因为现在的 Web 绝大多数是基于 HTTP/HTTPS 协议运行的。● httpd这通常指具体的软件进程d 代表 daemon即守护进程。比如 Apache 的进程名就叫 httpd。结论httpd 是实现 Web 服务的一种具体工具而 Web 服务是这一类功能的总称。在绝大多数日常语境下Web 服务和HTTP 服务可以划等号但在技术严谨性上Web 服务是一个更宽泛的概念。HTTP 协议本身只是一套“聊天规则”要让这套规则运行起来就需要安装专门的软件。比如● Nginx● Apache (httpd)● IIS (微软出品)● Tomcat (常用于 Java)这些软件运行在服务器上让服务器具备了“对外提供 HTTP 访问”的能力因此它们被称为 Web 服务器软件。安装启动官网https://nginx.org安装的方式分别是源码安装、yum源安装、epel源安装、docker安装等等选择你需要的这里主要针对第一种源码安装进行讲解并且后面的实验也是基于此对于docker安装会另起一篇待更新。源码安装准备工作如果有selinux记得关闭。更新源可以搜索华为源、阿里源、清华源等等对标自己的操作系统进行更新源。安装依赖编译工具yum install -y gcc pcre-devel zlib-devel openssl-devel下载安装包tar.gz在官网中有三种版本主流版本Mainline version 稳定版本 Stable version旧版本Legacy versions一般我们会选择稳定版本右击选择复制链接地址下载到服务器里wget https://nginx.org/download/nginx-1.28.3.tar.gz解压[rootshacofun ~]# tar xf nginx-1.28.3.tar.gz -C /opt/[rootshacofun ~]# cd /opt/[rootshacofun opt]# lltotal0drwxr-xr-x8502games229Mar2502:59 nginx-1.28.3接下来就可以进行编译安装了[rootshacofun nginx-1.28.3]# useradd nginx -s /sbin/nologin -M[rootshacofun nginx-1.28.3]# ./configure \--prefix/usr/local/nginx\--usernginx\--groupnginx\--with-http_ssl_module\--with-http_stub_status_module[rootshacofun nginx-1.28.3]# make make install[rootshacofun nginx-1.28.3]# make cleanrm-rfMakefile objs[rootshacofun ~]# cd /usr/local/nginx/[rootshacofun nginx]# ./sbin/nginx -vnginx version: nginx/1.28.3[rootshacofun nginx]# chown -R nginx:nginx /usr/local/nginx/logs注意如果后续需要增加功能模块需要重新执行./configure并且是把新添加的模块在之前参数的后面否则之前的模块会丢失然后make就可以了。启动[rootshacofun nginx]# ./sbin/nginx[rootshacofun nginx]# ss -lntpState Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN0100127.0.0.1:25 *:* users:((master,pid1160,fd13))LISTEN0128*:80 *:* users:((nginx,pid45830,fd6),(nginx,pid45829,fd6))LISTEN0128*:22 *:* users:((sshd,pid1007,fd3))LISTEN0100[::1]:25[::]:* users:((master,pid1160,fd14))LISTEN0128[::]:22[::]:* users:((sshd,pid1007,fd4))访问即可[rootshacofun nginx]# curl 127.0.0.1!DOCTYPE htmlhtmlheadtitleWelcome to nginx!/titlestylehtml{color-scheme: light dark;}body{width: 35em;margin:0auto;font-family: Tahoma, Verdana, Arial, sans-serif;}/style/headbodyh1Welcome to nginx!/h1pIf you see this page, the nginx web server is successfully installed and working. Further configuration is required./ppFor online documentation and support please refer toahrefhttp://nginx.org/nginx.org/a.br/Commercial support is available atahrefhttp://nginx.com/nginx.com/a./ppemThank youforusing nginx./em/p/body/html外部访问需要放行端口或者关闭防火墙参考# 1. 永久放行 80 端口tcp 协议firewall-cmd--permanent--add-port80/tcp# 2. 重新加载防火墙配置让刚才的设置生效firewall-cmd--reload# 3. 查看当前开放的端口列表确认是否有 80firewall-cmd --list-ports也许后面你需要更改端口那么你可以直接用服务名去放行# 直接放行 http 服务对应 80 端口firewall-cmd--permanent--add-servicehttp# 如果你以后配了 HTTPS记得把这个也加上对应 443 端口firewall-cmd--permanent--add-servicehttps# 同样需要 reloadfirewall-cmd--reload查看防火墙所有的放行规则包括服务、端口等 firewall-cmd --list-all那么云服务器的话就需要你去放行安全组yum源安装访问官网拉到最下面选择你的系统版本配置你的yum源文件复制进去然后就可以使用下载命令进行下载安装了yum install -y nginx启动的话 使用systemctl start nginx查看状态systemctl status nginx查看版本nginx -v操作命令[rootshacofun nginx]# ./sbin/nginx -hnginx version: nginx/1.28.3 Usage: nginx[-?hvVtTq][-s signal][-p prefix][-e filename][-c filename][-g directives]Options: -?,-h:thishelp-v:show version andexit#显示版本号-V:show version and configure optionsthenexit#显示版本及配置、模块详情-t:testconfiguration andexit# 检查 nginx.conf 语法是否正确-T:testconfiguration, dump it andexit#测试配置并打印-q:suppress non-error messages during configuration testing#跟-t一起连用静默模式,不报错不打印-ssignal:send signal to a master process: stop, quit, reopen, reload#向主进程发送信号 停止 退出 重新打开日志文件 重载配置-pprefix:setprefix path(default: /usr/local/nginx/)#指定 Nginx 相关文件的根目录-efilename:seterror logfile(default: logs/error.log)#覆盖配置文件中的 error_log 路径-cfilename:setconfigurationfile(default: conf/nginx.conf)#指定启动时加载哪个配置文件-gdirectives:setglobal directives out of configurationfile#设置全局指令可以覆盖配置文件中的全局块设置常用组合示例 修改配置后检查语法 nginx-t不停止服务直接应用新配置 nginx-sreload 使用自定义配置文件启动 nginx-c/etc/my_nginx.conf 查看编译时开启了哪些模块 nginx-V配置自启动[rootshacofun nginx]# vim /etc/systemd/system/nginx.service[Unit]DescriptionThe NGINX HTTP and reverse proxy serverAfternetwork-online.target remote-fs.target nss-lookup.targetWantsnetwork-online.target[Service]Typeforking# 注意以下路径需指向你编译安装的具体位置PIDFile/usr/local/nginx/logs/nginx.pidExecStartPre/usr/local/nginx/sbin/nginx-tExecStart/usr/local/nginx/sbin/nginxExecReload/usr/local/nginx/sbin/nginx-sreloadExecStop/bin/kill-sQUIT$MAINPIDPrivateTmptrue[Install]WantedBymulti-user.target[rootshacofun nginx]# systemctl daemon-reload就可以用systemctl去管理服务了配置功能生产上最常见的 Nginx 用途基本可以归纳成这几类反向代理、负载均衡、HTTPS、静态资源托管、访问控制、限流、缓存、日志与监控等等。location语法Nginx 的指令具有继承性。● 放在 location 外部http 或 server 层级 作为默认全局配置。如果请求匹配到的 location 块内没有定义自己的 root 或 index它就会继承外层的设置。● 放在 location 内部 作为局部覆盖配置。它只对当前 location 匹配到的请求生效。Location 常见语法,精确匹配,必须路径完全一致^~,前缀匹配,匹配开头一旦匹配成功不再检查正则~,正则匹配,区分大小写~*,正则匹配,不区分大小写/,通用匹配,匹配所有请求作为兜底目录浏览/下载当目录下没有 index.html 时自动列出文件列表像文件服务器一样autoindex on;情况1 直接打开比如 txt / html / 图片情况2 自动下载比如 zip / tar[rootweb02 conf]# ll /web1/total4-rw-r--r--1root root4Apr1014:26 index.html.bak drwxr-xr-x2root root19Apr1015:11 pkg01 drwxr-xr-x2root root6Apr1015:10 pkg02 drwxr-xr-x2root root6Apr1015:10 pkg03 drwxr-xr-x2root root6Apr1015:10 pkg04[rootweb02 conf]# cat /usr/local/nginx/conf.d/shacofun.confserver{listen80;server_name shacofun.test;location /{root /web1;index index.html;autoindex on;#开启目录索引,提供下载}}autoindex_exact_size off; #以人性化方式显示下载文件大小autoindex_localtime on; #服务器本地时间指定类型强制下载location ~*\.(txt|zip|docx)${root /web;add_header Content-Disposition attachment;}访问控制适合后台、内部接口、运维页面。location /admin/{allow192.168.1.0/24;allow10.0.0.0/8;deny all;}需要密码验证的话1.安装密码生成工具httpd-tools包2.生成密码 htpasswd[命令选项]用户名密码文件 用户名 常用选项-c创建文件然后添加用户密码加密-m对已有的文件进行用户密码加密 htpasswd-c/etc/nginx/.htpasswd shacofun New password: Re-type new password: Adding passwordforuser shacofunlocation /admin/{auth_basicadmin login;##就是一段描述auth_basic_user_file /etc/nginx/.htpasswd;#密码路径}注意:deny和allow的顺序是有影响的默认情况下从第一条规则进行匹配如果匹配成功则不继续匹配下面的内容。如果匹配不成功则继续往下寻找能匹配成功的内容。虚拟主机基于IP 对应修改 http模块中的 server基于端口基于域名常见一个 server 块基本就可以看作一个虚拟主机比如下面基于域名访问的例子[rootshacofun ~]# cat /nginx/conf.d/name.confserver{listen80;server_name www.aaa.com;location /{root /web1;index index.html index.htm;}}server{listen80;server_name www.bbb.com;location /{root /web2;index index.html index.htm;}}[rootshacofun ~]# mkdir /web1 /web2[rootshacofun ~]# echo web1 /web1/index.html[rootshacofun ~]# echo web2 /web2/index.html[rootshacofun ~]# curl http://www.aaa.com:80web1[rootshacofun ~]# curl http://www.bbb.com:80web2应用场景一个 Nginx 托管多个前端项目一个域名给官网一个域名给后台同一台机器上分站点部署反向代理Nginx 对外接请求再转发给后端应用。server{listen80;server_name api.example.com;location /{proxy_pass http://127.0.0.1:8080;proxy_set_header Host$host;proxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto$scheme;}}proxy_set_header Host $host; #把用户访问的域名传给后端proxy_set_header X-Real-IP $remote_addr; #告诉后端真实客户端 IP 是谁proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录“完整的访问链路 IP”proxy_set_header X-Forwarded-Proto $scheme; 告诉后端用户是用 http 还是 https 访问的生产用途Java、Python、Go、Node 服务统一入口隐藏后端真实端口给后端补充真实来源信息HTTPS线上基本必备。正式环境通常都要开 TLS。server{listen443ssl http2;server_name www.example.com;ssl_certificate /etc/nginx/ssl/fullchain.pem;ssl_certificate_key /etc/nginx/ssl/privkey.pem;ssl_protocols TLSv1.2 TLSv1.3;ssl_session_timeout 10m;location /{proxy_pass http://127.0.0.1:8080;proxy_set_header Host$host;proxy_set_header X-Real-IP$remote_addr;}}server{listen80;server_name www.example.com;return301https://$host$request_uri;}listen 443 ssl http2; 开启 HTTPS 和 HTTP/280 端口统一跳转到 443证书一般是 CA 签发证书生产用途登录、支付、后台系统对外 API所有正式站点负载均衡当后端不止一个实例时就会用到upstream。upstream backend{server10.0.0.11:8080;server10.0.0.12:8080;server10.0.0.13:8080;}server{listen80;server_name api.example.com;location /{proxy_pass http://backend;proxy_set_header Host$host;proxy_set_header X-Real-IP$remote_addr;}}默认策略是轮询加权示例upstream backend{server10.0.0.11:8080weight3;server10.0.0.12:8080weight1;}生产用途多实例应用灰度发布前的基础流量分发提升可用性和吞吐量超时与失败切换upstream backend{server10.0.0.11:8080max_fails3fail_timeout30s;server10.0.0.12:8080max_fails3fail_timeout30s;}server{listen80;server_name api.example.com;location /{proxy_pass http://backend;proxy_connect_timeout 5s;proxy_send_timeout 60s;proxy_read_timeout 60s;}}proxy_connect_timeout 连接后端超时时间proxy_read_timeout 读取后端响应超时时间max_fails 和 fail_timeout 可以做基础失败摘除限流与防刷生产上登录、短信、验证码、下单接口很常用http{limit_req_zone$binary_remote_addrzonereq_zone:10mrate5r/s;server{listen80;server_name api.example.com;location /login/{limit_reqzonereq_zoneburst10nodelay;proxy_pass http://127.0.0.1:8080;}}}rate5r/s 表示每个 IP 每秒 5 个请求burst10 允许一定瞬时突发nodelay 表示超出速率但在 burst 范围内的请求不排队直接处理连接数限制http{limit_conn_zone$binary_remote_addrzoneconn_zone:10m;server{location /{limit_conn conn_zone20;proxy_pass http://127.0.0.1:8080;}}}压缩gzipon;gzip_min_length 1k;gzip_comp_level5;gzip_types text/plain text/css application/json application/javascript application/xml;gzip_vary on;对文本类内容压缩效果很好图片、视频这类通常没必要 gzip日志log_format main$remote_addr - $host [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent rt$request_time uct$upstream_connect_time uht$upstream_header_time urt$upstream_response_time;access_log /usr/local/nginx/logs/access.log main;error_log /usr/local/nginx/logs/error.log warn;request_time 是总请求耗时upstream_* 可以看后端连接、响应头、响应耗时WebSocket 支持location /ws/{proxy_pass http://127.0.0.1:8080;proxy_http_version1.1;proxy_set_header Upgrade$http_upgrade;proxy_set_header Connectionupgrade;proxy_read_timeout 3600s;}Upgrade 和 Connection 是 WebSocket 必要头proxy_read_timeout 要适当调大用途在线聊天实时推送Web terminal实时监控页面安全响应头add_header X-Frame-Options SAMEORIGIN always;add_header X-Content-Type-Options nosniff always;add_header Referrer-Policy strict-origin-when-cross-origin always;add_header Strict-Transport-Securitymax-age31536000; includeSubDomainsalways;防止被 iframe 嵌套防止 MIME 嗅探HSTS 强制浏览器走 HTTPS用途对外正式站点管理后台登录页监控与状态页location /nginx_status{stub_status;allow127.0.0.1;deny all;}