16-源码安装nginx实战(CentOS7)

16-源码安装nginx实战(CentOS7) 源码安装Nginx实战(CentOS7)前言在Linux中安装Nginx主要有4种主流方式每种方式都有其优缺点和适用场景安装方式对比安装方式命令示例优点缺点适用场景1. 包管理器安装yum install nginxapt install nginx最简单、自动管理依赖、易于升级版本可能较旧、配置非标准快速部署、新手入门2. 源码编译安装./configure→make→make install完全可控、可自定义模块、最新版本复杂、需手动管理依赖生产环境定制、开发调试3. 官方预编译包下载.rpm/.deb安装官方维护、版本较新需手动下载、依赖处理需要较新版本4. Docker 容器docker run nginx环境隔离、一键部署需额外学习Docker容器化部署、微服务在这里我将进行源码编译安装Nginx。一、准备工作1. CentOS7的YUM镜像源配置# 阿里镜像源地址https://mirrors.aliyun.com/centos/7.9.2009/# 备份mkdir/etc/yum.repos.d/bakmv/etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/# 下载镜像源配置curl-o/etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo# 更新yum缓存验证安装yum clean allyum makecache yuminstall-yvim二、源码编译安装步骤1. 下载源码包使用wget命令下载# 下载稳定版的Nginx源码包wgethttp://nginx.org/download/nginx-1.25.3.tar.gz2. 安装依赖yum-yinstallgcc pcre-devel zlib-devel openssl-devel3. 解压源码包依赖安装完成后解压tar-zxvfnginx-1.25.3.tar.gz查看[rootlocalhost installation_package]# ls nginx-1.25.3 nginx-1.25.3.tar.gz4. 进入解压目录cdnginx-1.25.3/# 通过ls命令可以查看到[rootlocalhost nginx-1.25.3]# lsauto CHANGES CHANGES.ru conf configure contrib html LICENSEmanREADME src# 其中configure是一个安装命令通过ls -l命令可以查看到它是有执行权限的[rootlocalhost nginx-1.25.3]# ls -l total 824 drwxr-xr-x. 6 1001 1001 4096 Mar 16 23:38 auto -rw-r--r--. 1 1001 1001 325032 Oct 24 2023 CHANGES -rw-r--r--. 1 1001 1001 497029 Oct 24 2023 CHANGES.ru drwxr-xr-x. 2 1001 1001 168 Mar 16 23:38 conf -rwxr-xr-x. 1 1001 1001 2611 Oct 24 2023 configure # 安装命令 drwxr-xr-x. 4 1001 1001 72 Mar 16 23:38 contrib drwxr-xr-x. 2 1001 1001 40 Mar 16 23:38 html -rw-r--r--. 1 1001 1001 1397 Oct 24 2023 LICENSE drwxr-xr-x. 2 1001 1001 21 Mar 16 23:38 man -rw-r--r--. 1 1001 1001 49 Oct 24 2023 README drwxr-xr-x. 9 1001 1001 91 Mar 16 23:38 src5. 配置安装目录通过configure命令进行安装指定安装目录# 创建目录mkdir/opt/nginx# 执行命令安装并指定安装目录./configure--prefix/opt/nginx安装完成后进行查看ls /opt/nginx可以看到当前并无输出这是因为使用./configure并且指定安装目录只是现在正在配置当中写入到配置文件里面还未完完全全的去安装。6. 编译源码使用make命令才会进行一个源码的编译。等待编译完成再用源码安装一遍。make7. 安装Nginx使用make install命令进行源码安装。makeinstall再次使用ls /opt/nginx可以查看到已经有文件了。输出[rootlocalhost nginx-1.25.3]# ls /opt/nginx conf html logs sbin三、启动和验证1. 启动Nginx# 使用命令启动/opt/nginx/sbin/nginx# 查看进程ps-ef|grepnginx输出[rootlocalhost nginx-1.25.3]# ps -ef | grep nginx root 73711 1 0 23:54 ? 00:00:00 nginx: master process /opt/nginx/sbin/nginx nobody 73712 73711 0 23:54 ? 00:00:00 nginx: worker process root 73714 70758 0 23:54 pts/2 00:00:00 grep --colorauto nginx # 可以看到nginx的进程PID2. 验证Nginx是否正常启动使用curl命令查看nginx是否正常启动# 可以使用当前ip地址curl127.0.0.1输出[rootlocalhost nginx-1.25.3]# curl 127.0.0.1 !DOCTYPE html html head titleWelcome to nginx!/title style html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } /style /head body h1Welcome to nginx!/h1 pIf you see this page, the nginx web server is successfully installed and working. Further configuration is required./p pFor online documentation and support please refer to a hrefhttp://nginx.org/nginx.org/a.br/ Commercial support is available at a hrefhttp://nginx.com/nginx.com/a./p pemThank you for using nginx./em/p /body /html # 启动成功3. 检查配置文件# 使用nginx -t命令查看nginx的配置文件是否成功配置文件格式是否ok/opt/nginx/sbin/nginx-t输出[rootlocalhost nginx-1.25.3]# /opt/nginx/sbin/nginx -t nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok nginx: configuration file /opt/nginx/conf/nginx.conf test is successful四、配置命令快捷方式方法1创建软链接想直接使用nginx -t的形式查看会提示[rootlocalhost nginx-1.25.3]# nginx -t bash: nginx: command not found...找不到该命令可以创建一个软链接# 放到/usr/local/sbin目录下ln/opt/nginx/sbin/nginx /usr/local/sbin/nginx这时候使用nginx -t就可以查看成功了。方法2设置环境变量除了使用软链接这个方式还有一种设置变量的方式。# 先删除软链接rm/usr/local/sbin/nginx# 编辑配置文件vim.bashrc# 在底部添加一个export添加一个全局变量exportPATH$PATH:/opt/nginx/sbin# 添加好后通过source更新下配置即可直接使用source.bashrc# 再次执行nginx -t可以看到有输出脚本文件内容# .bashrc# User specific aliases and functionsaliasrmrm -ialiascpcp -ialiasmvmv -i# Source global definitionsif[-f/etc/bashrc];then./etc/bashrcfiexportPATH$PATH:/opt/nginx/sbin五、问题排查与解决问题为什么curl 127.0.0.1可以成功使用IP地址在浏览器中访问却不行原因1Nginx监听地址问题Nginx默认只监听127.0.0.1本地回环或0.0.0.0你执行curl 127.0.0.1成功说明Nginx正在运行但可能只绑定了127.0.0.1没有绑定0.0.0.0或你的网卡IP192.168.157.130。正确行为Nginx应该监听0.0.0.0:80所有网卡才能让外部访问。检查Nginx监听地址# 使用命令ss-tlnp|grep:80情况1我的输出[rootlocalhost ~]# ss -tlnp | grep :80 LISTEN 0 128 *:80 *:* users:((nginx,pid73712,fd6),(nginx,pid73711,fd6))这里的*:80表示Nginx监听所有网络接口0.0.0.0:80这排除了监听地址的问题。Nginx监听地址没问题下一步查看防火墙问题。情况2若看到类似于tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN 1234/nginx那就只能本机访问外部无法连接解决方案修改Nginx配置# 编辑默认配置文件vi/etc/nginx/nginx.conf# 或vi/etc/nginx/conf.d/default.conf找到server { listen 80; # 或 listen 127.0.0.1:80; ... }改为server { listen 80; # 或者明确监听所有IP # listen 0.0.0.0:80; ... }注意listen 80;默认就是监听0.0.0.0:80但有些发行版或配置可能显式写了127.0.0.1。# 最后重启Nginxsystemctl restart nginx# 再次检查监听ss-tlnp|grep:80# 确保是0.0.0.0:80原因2防火墙阻止了外部访问最有可能即使Nginx监听了0.0.0.0Linux防火墙firewalld / iptables可能阻止了80端口的外部访问。解决步骤# 查看防火墙状态是否启用systemctl status firewalld# 如果未启用使用systemctl start firewalld启动防火墙# 防火墙启用后检查80端口是否开放firewall-cmd --list-all期望输出ports: 80/tcp我的输出可以看到ports中并没有端口开放[rootlocalhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: ssh dhcpv6-client ports: # 无端口开放 protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:如果80端口不在列表中需要手动添加# 开放80端口firewall-cmd --add-port80/tcp--permanentfirewall-cmd--reload# 验证firewall-cmd --list-all最后测试测试本机访问确认Nginx响应# 用curl测试本机IPcurl192.168.157.130如果返回Nginx欢迎页面说明Nginx本身正常。