首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从零开始搞定Nginx:编译安装到实战配置,这一篇就够了!

从零开始搞定Nginx:编译安装到实战配置,这一篇就够了!

作者头像
悠悠12138
发布2025-09-29 14:54:36
发布2025-09-29 14:54:36
23800
代码可运行
举报
运行总次数:0
代码可运行

前几天讲了nginx的升级版本OpenResty和Tengine,说实话用nginx的人还是更多,今天就来唠唠它。现在很多人都习惯用yum或者apt直接装Nginx,但是编译安装真的有它的好处,比如可以自定义模块、优化性能参数什么的。

为什么要选择编译安装

可能有人会问,包管理器安装不是更简单吗?确实简单,但是编译安装有几个明显的优势。

第一个就是灵活性,你可以选择需要的模块,不需要的就不编译进去,这样可以减少内存占用。我之前遇到过一个项目,对性能要求特别高,通过编译安装去掉了一些不必要的模块,内存使用量直接降了20%。

第二个是版本控制,有时候你需要特定版本的Nginx,或者需要打一些补丁,编译安装就很方便了。

第三个是学习价值,通过编译安装你能更好地理解Nginx的结构和依赖关系。

准备工作和环境要求

在开始之前,我们需要准备一些基础环境。我这里用的是Rocky Linux release 8.10,其他发行版的话命令可能稍有不同,但思路是一样的。

首先更新一下系统:

代码语言:javascript
代码运行次数:0
运行
复制
yum update -y

然后安装编译工具和依赖包:

代码语言:javascript
代码运行次数:0
运行
复制
yum groupinstall "Development Tools" -y
yum install -y pcre-devel zlib-devel openssl-devel wget

这几个包都很重要,pcre是用来处理正则表达式的,zlib用于gzip压缩,openssl用于SSL支持。如果你不装这些,编译的时候会各种报错,我当年就在这里卡了好久。

创建一个专门的用户来运行Nginx:

代码语言:javascript
代码运行次数:0
运行
复制
useradd -r -s /sbin/nologin nginx

这里用-r参数创建系统用户,-s指定shell为nologin,这样更安全一些。

下载和编译Nginx

接下来我们下载Nginx源码。我建议去官网下载最新的稳定版本,不要下载mainline版本,除非你有特殊需求。

代码语言:javascript
代码运行次数:0
运行
复制
cd /usr/local/src
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

现在开始配置编译参数,这一步很关键,决定了你的Nginx有哪些功能:

代码语言:javascript
代码运行次数:0
运行
复制
./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-threads \
--with-stream \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-http_slice_module \
--with-file-aio \
--with-http_v2_module
image-20250909204424049
image-20250909204424049

image-20250909204424049

这个配置看起来很长,但每个参数都有它的作用。比如--with-http_ssl_module是SSL支持,--with-http_v2_module是HTTP/2支持,--with-stream是四层负载均衡支持。

如果configure过程中出现错误,通常是因为缺少依赖包。比如如果你要启用http_xslt_module,就需要安装libxslt-devel包。

配置完成后开始编译:

代码语言:javascript
代码运行次数:0
运行
复制
make && make install
image-20250909204748286
image-20250909204748286

image-20250909204748286

编译时间取决于你的机器性能,一般几分钟到十几分钟不等。我记得第一次编译的时候还挺紧张的,生怕出错。

创建必要的目录和文件

编译完成后,我们需要创建一些Nginx运行需要的目录:

代码语言:javascript
代码运行次数:0
运行
复制
mkdir -p /var/cache/nginx/client_temp
mkdir -p /var/cache/nginx/proxy_temp
mkdir -p /var/cache/nginx/fastcgi_temp
mkdir -p /var/cache/nginx/uwsgi_temp
mkdir -p /var/cache/nginx/scgi_temp

设置正确的权限:

代码语言:javascript
代码运行次数:0
运行
复制
chown -R nginx:nginx /var/cache/nginx
chown -R nginx:nginx /var/log/nginx

配置systemd服务

为了方便管理Nginx服务,我们创建一个systemd服务文件:

代码语言:javascript
代码运行次数:0
运行
复制
vim /etc/systemd/system/nginx.service

内容如下:

代码语言:javascript
代码运行次数:0
运行
复制
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
KillSignal=SIGQUIT
TimeoutStopSec=5
PrivateTmp=true

[Install]
WantedBy=multi-user.target
image-20250909204840291
image-20250909204840291

image-20250909204840291

然后重载systemd配置:

代码语言:javascript
代码运行次数:0
运行
复制
systemctl daemon-reload
systemctl enable nginx

基础配置文件详解

现在我们来看看Nginx的主配置文件。默认的配置文件在/etc/nginx/nginx.conf,我们先备份一下原文件:

代码语言:javascript
代码运行次数:0
运行
复制
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

然后编辑配置文件:

代码语言:javascript
代码运行次数:0
运行
复制
vim /etc/nginx/nginx.conf

我给出一个比较实用的基础配置:

代码语言:javascript
代码运行次数:0
运行
复制
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

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 2048;
    server_tokens off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/json
        application/javascript
        application/xml+rss
        application/atom+xml
        image/svg+xml;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;
        root /usr/share/nginx/html;

        location / {
            index index.html index.htm;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

这个配置包含了一些常用的优化参数。worker_processes设置为auto会自动根据CPU核心数设置工作进程数。gzip配置可以有效减少传输数据量。

创建网站目录和测试页面

创建网站根目录:

代码语言:javascript
代码运行次数:0
运行
复制
mkdir -p /usr/share/nginx/html

创建一个简单的测试页面:

代码语言:javascript
代码运行次数:0
运行
复制
cat > /usr/share/nginx/html/index.html << EOF
<!DOCTYPE html>
<html>
<head>
    <title>Welcome to nginx!</title>
</head>
<body>
    <h1>Welcome to nginx!</h1>
    <p>If you can see this page, the nginx web server is successfully installed and working.</p>
</body>
</html>
EOF

设置正确的权限:

代码语言:javascript
代码运行次数:0
运行
复制
chown -R nginx:nginx /usr/share/nginx/html

启动和测试Nginx

现在我们可以启动Nginx了:

代码语言:javascript
代码运行次数:0
运行
复制
systemctl start nginx
systemctl status nginx
image-20250909205049117
image-20250909205049117

image-20250909205049117

如果一切正常,你应该能看到nginx服务正在运行。

测试配置文件语法:

代码语言:javascript
代码运行次数:0
运行
复制
nginx -t

这个命令很有用,每次修改配置后都应该先测试一下语法是否正确。

打开浏览器访问服务器IP地址,应该能看到我们刚才创建的测试页面。

image-20250909205145463
image-20250909205145463

image-20250909205145463

虚拟主机配置

在实际使用中,我们通常需要配置多个网站,这就需要用到虚拟主机功能。

首先创建配置目录:

代码语言:javascript
代码运行次数:0
运行
复制
mkdir -p /etc/nginx/conf.d

创建一个虚拟主机配置文件:

代码语言:javascript
代码运行次数:0
运行
复制
vim /etc/nginx/conf.d/example.com.conf

内容如下:

代码语言:javascript
代码运行次数:0
运行
复制
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html index.htm index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

这个配置包含了PHP支持和一些安全设置。

SSL证书配置

现在HTTPS已经是标配了,我们来配置SSL证书。这里以Let's Encrypt免费证书为例:

首先安装certbot:

代码语言:javascript
代码运行次数:0
运行
复制
yum install -y epel-release
yum install -y certbot

申请证书:

代码语言:javascript
代码运行次数:0
运行
复制
certbot certonly --webroot -w /var/www/example.com -d example.com -d www.example.com

修改虚拟主机配置,添加HTTPS支持:

代码语言:javascript
代码运行次数:0
运行
复制
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html index.htm index.php;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    
    add_header Strict-Transport-Security "max-age=63072000" always;

    location / {
        try_files $uri $uri/ =404;
    }
}

负载均衡配置

Nginx的负载均衡功能也很强大,配置起来也不复杂:

代码语言:javascript
代码运行次数:0
运行
复制
upstream backend {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 weight=1 backup;
}

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://backend;
        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_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
    }
}

这个配置实现了基于权重的负载均衡,还设置了一个备用服务器。

性能优化和监控

为了更好的性能,我们可以调整一些参数。在http块中添加:

代码语言:javascript
代码运行次数:0
运行
复制
client_max_body_size 100m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;

启用状态监控:

代码语言:javascript
代码运行次数:0
运行
复制
location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    deny all;
}

这样你就可以通过访问/nginx_status来查看Nginx的运行状态了。

日志管理和轮转

Nginx的日志会越来越大,我们需要配置日志轮转。创建logrotate配置:

代码语言:javascript
代码运行次数:0
运行
复制
vim /etc/logrotate.d/nginx

内容:

代码语言:javascript
代码运行次数:0
运行
复制
/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 644 nginx nginx
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

添加网站密码验证

代码语言:javascript
代码运行次数:0
运行
复制
server {
    listen 80;
    server_name example.com;

    location / {
        auth_basic "Restricted Area";
        auth_basic_user_file /etc/nginx/.htpasswd;
        
        # 其他配置...
        root /var/www/html;
        index index.html;
    }
}

要创建密码文件,可以使用以下命令:

代码语言:javascript
代码运行次数:0
运行
复制
# 安装htpasswd工具(如果没有)
# Debian/Ubuntu
sudo apt-get install apache2-utils
# CentOS/RHEL
sudo yum install httpd-tools

# 创建密码文件(首次创建用户)
sudo htpasswd -c /etc/nginx/.htpasswd username

# 添加更多用户(不使用-c参数)
sudo htpasswd /etc/nginx/.htpasswd another_user

完成后重新加载Nginx配置:

代码语言:javascript
代码运行次数:0
运行
复制
sudo nginx -t && sudo nginx -s reload

Nginx四层代理(TCP/UDP)配置

代码语言:javascript
代码运行次数:0
运行
复制
# 在http块外部添加stream块
stream {
    # 定义上游服务器组
    upstream backend_tcp {
        server backend1.example.com:3306 weight=5;
        server backend2.example.com:3306 backup;
    }

    # TCP代理配置
    server {
        listen 3306;            # 监听的本地端口
        proxy_pass backend_tcp; # 转发到上游服务器组
        proxy_timeout 3s;       # 超时设置
        proxy_connect_timeout 1s;
    }

    # UDP代理配置示例
    server {
        listen 53 udp;          # UDP监听端口
        proxy_pass dns_servers; # 转发到DNS服务器组
        proxy_timeout 20s;
    }

    upstream dns_servers {
        server 8.8.8.8:53;
        server 8.8.4.4:53;
    }
}

这个配置示例包含了:

  1. 1. TCP代理(例如MySQL数据库端口3306)
  2. 2. UDP代理(例如DNS端口53)
  3. 3. 上游服务器组配置
  4. 4. 基本的超时设置

注意:四层代理需要在Nginx编译时包含--with-stream模块,如果使用的是预编译包,确保安装了nginx-extras或包含stream模块的相应包。

常见问题和解决方案

在使用过程中可能会遇到一些问题,我总结几个常见的:

  1. 1. 403 Forbidden错误:通常是权限问题,检查文件和目录的所有者和权限。
  2. 2. 502 Bad Gateway:一般是后端服务没有启动或者配置错误。
  3. 3. 413 Request Entity Too Large:请求体太大,调整client_max_body_size参数。
  4. 4. 配置文件语法错误:使用nginx -t命令检查语法。

我记得有一次配置反向代理,总是502错误,折腾了半天才发现是SELinux的问题,执行了setsebool -P httpd_can_network_connect 1就解决了。

安全加固建议

安全方面也需要注意几点:

  1. 1. 隐藏版本信息:server_tokens off;
  2. 2. 限制请求方法:只允许GET、POST等必要的方法
  3. 3. 设置合适的超时时间
  4. 4. 使用fail2ban防止暴力破解
  5. 5. 定期更新Nginx版本

还可以添加一些安全头:

代码语言:javascript
代码运行次数:0
运行
复制
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;

最后

通过编译安装Nginx确实比包管理器安装要复杂一些,但是带来的灵活性和可控性是值得的。从下载源码到配置虚拟主机、SSL证书、负载均衡,每一步都需要仔细操作。

我建议大家在学习的时候多动手实践,遇到问题不要怕,查日志、看文档、搜索解决方案,这样才能真正掌握Nginx的使用。

现在的Web架构越来越复杂,Nginx作为入口网关的作用也越来越重要。掌握好Nginx的编译安装和配置,对于运维工作来说是很有价值的技能。

希望这篇文章能帮到正在学习Nginx的朋友们。如果你觉得有用的话,记得点赞转发,让更多的人看到。有问题也欢迎在评论区讨论,我会尽量回复大家的。

如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

公众号:运维躬行录

个人博客:躬行笔记

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维躬行录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要选择编译安装
  • 准备工作和环境要求
  • 下载和编译Nginx
  • 创建必要的目录和文件
  • 配置systemd服务
  • 基础配置文件详解
  • 创建网站目录和测试页面
  • 启动和测试Nginx
  • 虚拟主机配置
  • SSL证书配置
  • 负载均衡配置
  • 性能优化和监控
  • 日志管理和轮转
  • 添加网站密码验证
  • Nginx四层代理(TCP/UDP)配置
  • 常见问题和解决方案
  • 安全加固建议
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档