Nginx安装与启动全指南:从源码编译到systemd服务管理
1. 项目概述:从零到一,构建你的第一个Nginx服务
如果你刚接触Web服务器,或者正准备从Apache转向更现代的架构,Nginx(发音为“engine-x”)绝对是你绕不开的名字。它早已不是那个单纯的“高性能HTTP和反向代理服务器”了,如今更是负载均衡、API网关、静态资源服务乃至微服务入口的基石。但无论它的功能多么强大,第一步永远是把它正确地安装并运行起来。这篇内容,就是为你——无论是运维新手、后端开发,还是对服务器技术感兴趣的学习者——准备的一份超详细的Nginx安装与启动指南。我会假设你从一台干净的Linux服务器(以CentOS 7/8和Ubuntu 20.04/22.04为主流示例)开始,手把手带你走过源码编译和包管理器安装两条经典路径,并深入讲解安装后的各种启动、停止、重载方式及其背后的原理。你会发现,一个简单的nginx -s reload命令背后,其实藏着进程模型和信号处理的精巧设计。搞懂这些,不仅是完成部署,更是理解Nginx稳定高效运行的开始。
2. 核心安装路径解析:源码编译 vs 系统包管理
面对Nginx安装,你首先会面临一个选择:是使用操作系统自带的包管理工具(如yum或apt)一键安装,还是下载源码自己编译?这不是一个随意的决定,两种方式各有明确的适用场景和优劣,选错了可能会给后续的维护和功能扩展带来麻烦。
2.1 源码编译安装:极致定制与深度控制
源码编译是“硬核”玩家的首选,也是生产环境中追求特定优化和功能的常见做法。它的核心优势在于完全的控制权。你可以指定安装路径(避免文件散落在系统各处)、选择需要编译的模块(剔除无用模块以减小体积和攻击面)、调整编译参数(如针对特定CPU架构的优化),甚至应用第三方扩展模块。
为什么选择源码编译?
- 版本自由:你可以安装任何版本,包括最新的主线版或某个特定的稳定版,不受系统仓库版本滞后的限制。
- 模块定制:Nginx有很多官方模块和第三方模块。通过编译参数,你可以像搭积木一样决定包含哪些模块。例如,如果你需要支持
Lua脚本扩展,就必须在编译时加入--with-http_lua_module。 - 路径清晰:所有相关文件(二进制文件、配置文件、日志文件、库文件)都可以集中安装到自定义目录(如
/usr/local/nginx),便于管理和备份。 - 性能调优:可以传递编译器优化标志,为你的特定硬件环境生成最优化的二进制文件。
编译安装的核心步骤与实操要点:整个流程可以概括为:准备环境 -> 下载源码 -> 配置参数 -> 编译 -> 安装。以下是基于CentOS 8的详细操作记录。
首先,安装编译所需的开发工具和库依赖。这是最容易出错的一步,缺失的依赖会导致配置或编译失败。
# CentOS/RHEL/AlmaLinux/Rocky Linux 系列 sudo dnf groupinstall -y "Development Tools" sudo dnf install -y pcre-devel zlib-devel openssl-devel wget # Ubuntu/Debian 系列 sudo apt update sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev wget注意:
pcre(Perl兼容正则表达式库)用于location路径匹配等,zlib用于Gzip压缩,openssl用于SSL/TLS。它们是Nginx的核心依赖,务必安装其-devel或-dev开发包。
接着,下载并解压Nginx源码。建议访问Nginx官网获取稳定版链接。
cd /usr/local/src sudo wget http://nginx.org/download/nginx-1.24.0.tar.gz sudo tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0最关键的一步是执行./configure进行配置。这里我给出一个兼顾通用性和功能的配置示例:
sudo ./configure \ --prefix=/usr/local/nginx \ # 指定安装根目录 --user=nginx \ # 指定运行worker进程的系统用户 --group=nginx \ # 指定运行worker进程的系统用户组 --with-http_ssl_module \ # 启用HTTPS支持 --with-http_v2_module \ # 启用HTTP/2协议支持 --with-http_realip_module \ # 用于从代理头中获取真实客户端IP --with-http_gzip_static_module \ # 发送预压缩的.gz文件 --with-http_stub_status_module \ # 启用状态监控页面 --with-threads \ # 启用线程池支持,提升IO性能 --with-file-aio # 启用异步文件IO执行./configure后,请务必仔细查看输出结尾。如果出现“configuration is successful”则成功;如果报错,通常会明确提示缺少哪个库,按提示安装即可。
配置成功后,进行编译和安装:
sudo make # 编译,此过程耗时较长,取决于服务器性能 sudo make install # 安装到 --prefix 指定的目录安装完成后,Nginx的主要文件会出现在/usr/local/nginx/目录下:
sbin/nginx:主程序二进制文件。conf/nginx.conf:主配置文件。html/:默认的网站根目录。logs/:日志文件目录。
实操心得:
- 在
./configure之前,最好先创建运行用户nginx:sudo useradd -r -s /sbin/nologin nginx。这符合最小权限原则,避免使用root运行worker进程。 - 使用
--with-开头的参数是启用默认未编译的模块,而--without-则是禁用默认会编译的模块。可以通过./configure --help查看所有选项。 - 编译安装后,二进制文件不在系统的
PATH环境变量中,你需要使用绝对路径(如/usr/local/nginx/sbin/nginx)来执行命令,或者创建软链接到/usr/bin/。
2.2 系统包管理安装:追求便捷与稳定维护
对于大多数需要快速部署、或者希望与系统更新保持同步的场景,使用包管理器是最佳选择。它能自动解决依赖关系,提供标准的服务管理脚本(systemdunit file),安装位置也符合系统规范(FHS)。
为什么选择包管理安装?
- 极速部署:一条命令完成安装、依赖解决和基础配置。
- 易于管理:无缝集成
systemd,可以使用systemctl进行便捷的服务生命周期管理(start,stop,restart,status,enable)。 - 自动更新:可以通过系统更新机制安全地获取Nginx的安全补丁和版本更新。
- 社区支持:发行版维护者通常会进行额外的测试和打补丁,稳定性有保障。
包管理安装的核心步骤:不同Linux发行版的命令不同,但逻辑一致:添加官方仓库 -> 安装。
对于 Ubuntu/Debian:
sudo apt update sudo apt install -y nginx安装后,Nginx会自动启动。你可以通过sudo systemctl status nginx来验证。
对于 CentOS/RHEL 8+:默认仓库可能没有Nginx或版本较旧。建议添加Nginx官方仓库。
# 1. 安装EPEL仓库(Extra Packages for Enterprise Linux) sudo dnf install -y epel-release # 2. 添加Nginx官方仓库(可选,以获得最新稳定版) sudo vi /etc/yum.repos.d/nginx.repo将以下内容粘贴到nginx.repo文件中(以稳定版为例):
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true然后安装:
sudo dnf makecache sudo dnf install -y nginx sudo systemctl start nginx sudo systemctl enable nginx # 设置开机自启两种方式的主要区别与选择建议:
| 特性 | 源码编译安装 | 系统包管理安装 |
|---|---|---|
| 版本控制 | 完全自由,可安装任意版本 | 受仓库版本限制,可能不是最新 |
| 模块定制 | 高度灵活,可任意增减模块 | 固定模块集,通常包含常用模块 |
| 安装路径 | 可自定义,集中化管理 | 符合FHS,文件分散在/etc/nginx,/usr/share/nginx,/var/log/nginx等 |
| 安装复杂度 | 较高,需手动处理依赖和编译 | 极低,一键完成 |
| 服务管理 | 需手动配置systemd服务文件 | 自动集成systemd,管理方便 |
| 更新维护 | 需手动下载新源码重新编译 | 可通过包管理器一键更新 |
| 适用场景 | 生产环境深度定制、需要特定第三方模块、学习研究 | 快速部署、开发测试环境、希望简化维护 |
我的建议是:如果你是初学者,或者搭建测试/开发环境,毫不犹豫选择包管理安装,它能让你避开很多初期的坑。当你需要对Nginx进行深度定制,或生产环境有特殊模块需求时,再考虑源码编译。
3. 安装后的首要配置与验证
无论通过哪种方式安装,成功之后的第一件事不是急着用,而是进行基础配置和验证,确保Nginx以你期望的方式运行。
3.1 关键目录结构与配置文件初探
了解Nginx安装后的文件布局,是管理它的基础。
源码编译安装(以/usr/local/nginx为例):
/usr/local/nginx/sbin/nginx:核心。Nginx的主程序文件。/usr/local/nginx/conf/nginx.conf:核心。主配置文件。所有配置的起点。/usr/local/nginx/html/:默认的网站根目录,里面通常有index.html和50x.html。/usr/local/nginx/logs/:存放访问日志(access.log)和错误日志(error.log)。这是排查问题的黄金位置。
包管理安装(以Ubuntu为例):
/usr/sbin/nginx:主程序文件。/etc/nginx/:核心配置目录。nginx.conf:主配置文件。sites-available/:存放可用的网站配置文件(虚拟主机)。sites-enabled/:存放已启用的网站配置文件(通常是指向sites-available中文件的软链接)。conf.d/:存放额外的配置片段。modules-available/,modules-enabled/:模块配置。
/var/www/html/:默认的网站根目录。/var/log/nginx/:日志目录。
首要安全与基础配置:安装后,建议先检查主配置文件nginx.conf中的几个关键点:
- 运行用户:确保不是以
root运行。在nginx.conf顶部找user指令。包管理安装通常已设为www-data(Debian系)或nginx(RHEL系)。源码编译安装需你手动在配置中指定user nginx;(前提是你已创建nginx用户)。 - worker进程数:
worker_processes auto;是一个好设置,让Nginx根据CPU核心数自动设置。 - 测试配置文件语法:在修改任何配置后,必须执行语法测试,这是避免线上事故的铁律。
# 源码编译安装 /usr/local/nginx/sbin/nginx -t # 包管理安装 nginx -t如果输出“syntax is ok”和“test is successful”,说明配置文件语法正确。
3.2 验证Nginx服务是否正常运行
配置无误后,启动服务并验证。
启动Nginx:
- 源码编译安装:首次启动需用绝对路径。
无任何输出表示启动成功(Nginx的哲学:没有消息就是好消息)。sudo /usr/local/nginx/sbin/nginx - 包管理安装:使用
systemctl。sudo systemctl start nginx sudo systemctl enable nginx # 设置开机自启
验证服务状态:
- 检查进程:使用
ps命令查看是否有Nginx进程。
ps aux | grep nginx你应该能看到一个master进程(以root运行,如果配置了user指令为非root,则master仍为root)和若干个worker进程(以你配置的用户,如nginx运行)。 2.检查端口:Nginx默认监听80端口。
sudo ss -tlnp | grep :80 # 或使用 netstat sudo netstat -tlnp | grep :80- 访问测试页:在服务器本地或同一网络的另一台机器上,用浏览器或
curl访问服务器的IP地址。
curl http://服务器IP地址如果看到Nginx的欢迎HTML页面(通常是“Welcome to nginx!”),恭喜你,安装和基础启动成功了。
注意:如果无法访问,首先检查服务器防火墙是否放行了80端口。对于CentOS/RHEL的
firewalld:sudo firewall-cmd --permanent --add-service=http && sudo firewall-cmd --reload。对于Ubuntu的ufw:sudo ufw allow 'Nginx HTTP'。
4. Nginx进程模型与多种启动停止方式详解
Nginx采用经典的Master-Worker多进程模型。理解这个模型,是理解其各种操作方式的关键。
4.1 Master-Worker进程模型解析
当你启动Nginx时,实际上启动了两个(或更多)进程:
- Master Process(主进程):以
root权限运行(因为需要绑定80/443等特权端口)。它不处理具体的客户端请求,只负责管理Worker进程:启动、停止、重载配置、平滑升级、日志重开等。它是“管理者”。 - Worker Process(工作进程):以配置文件中
user指令指定的非特权用户运行(如nginx)。它们才是真正负责处理网络连接、读取请求、处理请求并返回响应的“劳动者”。通常,Worker进程数量与CPU核心数相等(worker_processes auto;),充分利用多核CPU。
这种架构的好处是:
- 高稳定性:Worker进程相互独立,一个崩溃不会影响其他Worker,Master进程会立刻重启一个新的Worker。
- 高效利用多核:每个Worker进程在一个CPU核心上运行,避免了线程锁的竞争。
- 热重载与平滑升级:Master进程可以在不停止服务的情况下,加载新配置或新二进制文件。
4.2 通过Nginx二进制文件直接操作(信号控制)
这是最原始也是最直接的控制方式,通过向Nginx的Master进程发送特定的信号来实现。你需要知道Nginx主进程的PID,它通常写在/usr/local/nginx/logs/nginx.pid(源码编译)或/var/run/nginx.pid(包管理安装)文件中。
常用操作命令:
# 1. 启动(直接运行二进制文件,默认加载conf/nginx.conf) /usr/local/nginx/sbin/nginx # 2. 快速停止(立刻终止所有进程) /usr/local/nginx/sbin/nginx -s stop # 相当于向Master进程发送 SIGTERM 信号。 # 3. 优雅停止(处理完当前请求后再停止) /usr/local/nginx/sbin/nginx -s quit # 相当于向Master进程发送 SIGQUIT 信号。**生产环境停止服务的首选方式**。 # 4. 重载配置文件(不中断服务) /usr/local/nginx/sbin/nginx -s reload # 相当于向Master进程发送 SIGHUP 信号。Master会检查新配置语法,若正确则启动新的Worker,并优雅关闭旧的Worker。 # 5. 重新打开日志文件(用于日志切割) /usr/local/nginx/sbin/nginx -s reopen # 相当于向Master进程发送 SIGUSR1 信号。在日志文件被`logrotate`切割后,通知Nginx重新打开日志文件。 # 6. 测试配置文件语法 /usr/local/nginx/sbin/nginx -t实操心得:
-s reload是最常用的命令之一。每次修改nginx.conf或vhost配置后,务必先nginx -t测试,再nginx -s reload生效。这个过程对用户请求是零感知的,因为新旧Worker会并存一小段时间。-s quit和-s stop有本质区别。stop是强制停止,可能导致正在处理的请求被中断。quit是优雅停止,Master会通知Worker处理完手头请求后再退出,生产环境下线服务时务必使用quit。- 如果Nginx二进制文件路径已在
PATH中,可以直接使用nginx命令代替绝对路径。
4.3 通过Systemd服务管理(现代Linux标准)
对于通过包管理器安装的Nginx,或者你手动为源码编译的Nginx配置了systemd服务文件,那么systemctl是更现代、更推荐的管理方式。它统一了服务管理接口,并提供了更好的日志集成(通过journalctl)。
标准服务管理命令:
# 启动服务 sudo systemctl start nginx # 停止服务(相当于发送SIGTERM,非优雅停止) sudo systemctl stop nginx # 重启服务(先stop再start,会中断服务) sudo systemctl restart nginx # 重载服务(相当于发送SIGHUP,优雅重载配置) sudo systemctl reload nginx # 查看服务状态 sudo systemctl status nginx # 设置开机自启 sudo systemctl enable nginx # 禁用开机自启 sudo systemctl disable nginx # 检查服务是否启用 sudo systemctl is-enabled nginx为源码编译的Nginx配置Systemd服务:如果你选择源码编译,又想享受systemctl的便利,可以手动创建服务文件。
创建服务单元文件:
sudo vi /etc/systemd/system/nginx.service写入以下内容(根据你的安装路径调整):
[Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true User=nginx Group=nginx [Install] WantedBy=multi-user.target注意:
ExecStartPre在启动前测试配置,这是一个好习惯。ExecStop使用了-s quit进行优雅停止。重新加载
systemd配置并启用服务:sudo systemctl daemon-reload sudo systemctl enable nginx sudo systemctl start nginx
systemctl reload vs restart 的深刻理解:这是新手容易混淆的地方。
sudo systemctl reload nginx:等同于nginx -s reload。热重载配置,不中断现有连接,平滑过渡。修改配置后的标准操作。sudo systemctl restart nginx:等同于先nginx -s stop再nginx。完全重启服务,会中断所有正在处理的连接。通常在升级Nginx二进制程序、或者服务出现无法通过重载解决的异常状态时使用。
4.4 其他启动与控制方式
除了上述两种主流方式,还有一些特定场景下的操作:
指定配置文件启动:默认情况下,Nginx会加载编译时指定的--conf-path(默认为安装目录/conf/nginx.conf)。你可以用-c参数指定一个不同的配置文件启动,常用于测试新配置或运行多个独立实例。
/usr/local/nginx/sbin/nginx -c /path/to/your/nginx.test.conf以调试模式运行(前台运行):默认Nginx会以守护进程(daemon)模式运行,转入后台。使用-g指令可以覆盖配置文件中的daemon指令,使其在前台运行,方便调试。
/usr/local/nginx/sbin/nginx -g "daemon off;"这在Docker容器中运行Nginx时是标准做法,因为容器需要有一个前台进程才能保持运行。
平滑升级Nginx二进制文件:这是Nginx一个非常强大的特性,可以在不停止服务的情况下升级其自身版本。
- 备份旧二进制文件。
- 编译或下载新版本的Nginx二进制文件。
- 向旧Master进程发送
USR2信号:kill -USR2 旧MasterPID。此时,旧Master会重命名自己的PID文件(如nginx.pid.oldbin),并启动一个新的Master进程(使用新的二进制文件)。 - 此时新旧两套Master-Worker进程并存,共同处理请求。
- 向旧Master进程发送
WINCH信号:kill -WINCH 旧MasterPID。旧Master会优雅地关闭其下的Worker进程,但自己保留。此时流量全部由新Worker处理。 - 测试新版本服务是否正常。
- 如果测试成功,向旧Master发送
QUIT信号:kill -QUIT 旧MasterPID,使其完全退出。如果测试失败,可以回滚:向旧Master发送HUP信号重启其Worker,并向新Master发送QUIT信号关闭它。
这个过程较为复杂,生产环境操作需极其谨慎,并做好完备的回滚预案。
5. 安装与启动过程中的常见问题排查实录
即便按照步骤操作,你也可能会遇到一些问题。这里记录了几个最常见的问题及其排查思路。
5.1 端口占用问题:80端口被占用
这是最常见的问题。Nginx启动失败,错误日志(error.log)中常出现“bind() to 0.0.0.0:80 failed (98: Address already in use)”或类似信息。
排查步骤:
- 确认占用者:使用
ss或netstat命令查看80端口的占用情况。sudo ss -tlnp | grep :80 sudo netstat -tlnp | grep :80 - 常见占用者及处理:
- Apache/httpd:如果系统之前安装过Apache,它可能正在运行并占用80端口。你需要停止并禁用Apache:
sudo systemctl stop httpd && sudo systemctl disable httpd,或者修改Apache的监听端口。 - 其他Nginx实例:可能已经有一个Nginx在运行了。用
ps aux | grep nginx确认,并用sudo nginx -s quit停止它。 - 其他应用:如某些开发环境自带的Web服务器。根据
ss命令输出的PID和进程名,决定是停止它还是为Nginx换一个端口(修改nginx.conf中的listen指令)。
- Apache/httpd:如果系统之前安装过Apache,它可能正在运行并占用80端口。你需要停止并禁用Apache:
5.2 权限问题:无法绑定特权端口或访问文件
Nginx的Master进程需要绑定80或443端口,这需要root权限。Worker进程需要读取网页文件、写入日志。
典型错误与解决:
bind() to 0.0.0.0:80 failed (13: Permission denied):通常是因为你试图用非root用户直接启动Nginx。必须使用sudo或以root身份启动第一次。启动后,Master是root,Worker会降权到配置文件中user指令指定的用户。[alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (13: Permission denied):日志目录或文件对运行Nginx的用户(如nginx)没有写权限。确保日志目录的所有者和权限正确:sudo chown -R nginx:nginx /usr/local/nginx/logs/ sudo chmod -R 755 /usr/local/nginx/logs/- 访问静态文件返回403 Forbidden:Worker进程用户(如
nginx)对网站根目录(如/var/www/html或/usr/local/nginx/html)下的文件没有读权限。确保目录和文件的权限允许Nginx用户读取:sudo chown -R nginx:nginx /var/www/html/ sudo chmod -R 755 /var/www/html/ # 对于文件,通常644权限即可:sudo find /var/www/html -type f -exec chmod 644 {} \;
5.3 配置文件语法错误
在重载或重启时,如果配置文件有语法错误,操作会失败。
排查方法:
- 永远先测试:执行
sudo nginx -t或sudo /usr/local/nginx/sbin/nginx -t。它会精确地指出配置文件中哪一行、哪个指令有错误。 - 查看错误日志:如果启动失败,第一时间查看Nginx的错误日志
error.log,通常会有详细的错误描述。 - 常见语法错误:
- 指令末尾缺少分号
;。 - 花括号
{}不匹配。 - 在不允许的上下文中使用了某个指令。
- 路径错误,例如
root或access_log指令中使用了不存在的目录。
- 指令末尾缺少分号
5.4 依赖模块缺失
在源码编译安装后,配置文件中使用了某个模块的功能,但编译时并未包含该模块。
错误示例:配置中使用了ssl_certificate指令,但编译时未添加--with-http_ssl_module,Nginx会在测试配置时报错,提示未知指令“ssl_certificate”。
解决方案:只有重新编译Nginx,在./configure步骤中加入所需的模块参数。这是一个深刻的教训:在编译前,务必根据业务需求规划好需要哪些模块。
5.5 防火墙或SELinux拦截
服务正常启动,本地curl也能通,但外部网络无法访问。
排查步骤:
- 检查防火墙:确认80端口已在防火墙规则中放行。命令见上文3.2节。
- 检查SELinux(主要针对RHEL/CentOS):SELinux可能会阻止Nginx绑定端口或访问文件。
- 临时禁用(用于测试):
sudo setenforce 0。如果禁用后能访问,说明是SELinux问题。 - 永久解决:不建议直接禁用SELinux。更安全的方式是修改相关策略。例如,允许Nginx绑定HTTP端口:
sudo setsebool -P httpd_can_network_connect 1。或者针对特定目录调整文件上下文:sudo chcon -Rt httpd_sys_content_t /your/webroot/。 - 查看SELinux拒绝日志:
sudo ausearch -m avc -ts recent或sudo dmesg | grep -i selinux。
- 临时禁用(用于测试):
6. 生产环境部署的进阶考量与建议
当你成功安装并启动Nginx后,对于生产环境,还有一些重要的步骤和最佳实践。
6.1 系统优化与参数调整
在nginx.conf的events块和http块中,有一些关键参数影响性能。
user nginx; worker_processes auto; # 与CPU核心数一致 error_log /var/log/nginx/error.log warn; # 错误日志级别设为warn,减少磁盘IO pid /var/run/nginx.pid; events { worker_connections 1024; # 单个worker进程最大连接数。可调高,但受系统`ulimit -n`限制。 use epoll; # Linux下高性能的多路复用IO模型 multi_accept on; # 允许worker同时接受多个新连接 } http { # 隐藏Nginx版本号,提升安全性 server_tokens off; # 设置客户端请求头缓冲区大小,应对大Cookie等场景 client_header_buffer_size 4k; large_client_header_buffers 4 16k; # 开启高效文件传输模式 sendfile on; tcp_nopush on; tcp_nodelay on; # 保持连接超时时间 keepalive_timeout 65; # 限制客户端请求体大小,防止DoS攻击 client_max_body_size 10m; ... }调整这些参数需要结合实际的服务器硬件、网络条件和业务流量进行测试和调优。
6.2 日志配置与管理
清晰的日志是运维的基石。在生产环境,建议将访问日志和错误日志分离,并按日期或大小进行切割。
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-%Y%m%d.log main; error_log /var/log/nginx/error.log warn; }使用logrotate工具可以自动管理日志文件的轮转、压缩和删除。通常包管理安装的Nginx会自带logrotate配置(/etc/logrotate.d/nginx)。对于源码编译,可以手动配置。
6.3 编写一个基本的虚拟主机配置
一个典型的用于静态网站的服务器块配置示例:
server { listen 80; server_name yourdomain.com www.yourdomain.com; # 你的域名 root /var/www/yourdomain.com/html; # 网站文件根目录 index index.html index.htm; location / { try_files $uri $uri/ =404; # 尝试按顺序寻找文件,都找不到则返回404 } # 禁止访问隐藏文件(如.htaccess, .git) location ~ /\. { deny all; } # 静态资源缓存设置 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; # 客户端缓存30天 add_header Cache-Control "public, immutable"; } # 错误页面定制 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }将这个配置文件放在/etc/nginx/conf.d/目录下(包管理安装)或/usr/local/nginx/conf/vhosts/目录下(源码编译,需在主配置中用include指令引入),然后执行sudo nginx -t && sudo nginx -s reload即可生效。
从一条简单的安装命令到理解其背后的进程模型和信号机制,再到能从容处理各种启动方式和排查常见问题,这个过程本身就是对Nginx这个强大工具的一次深度握手。我个人的体会是,初期遇到问题不要慌,error.log和nginx -t是你的第一求助对象。养成修改配置前先备份、生效前先测试的习惯,能在生产环境中避免很多不必要的麻烦。最后,关于启动方式,在掌握了直接信号控制的基础上,我强烈推荐统一使用systemctl进行管理,它与现代Linux系统的集成度更高,管理起来也更规范。当你熟悉了这些基础操作,就可以更自信地探索Nginx在反向代理、负载均衡、缓存加速等更高级领域的应用了。
