# nginx-install **Repository Path**: gmzd88/nginx-install ## Basic Information - **Project Name**: nginx-install - **Description**: nginx install script - **Primary Language**: Perl - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-26 - **Last Updated**: 2026-02-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## [原创]step-by-step install Nginx反向代理服务器(Ubuntu 24.04 LTS) 本文原创:2018.06.13 发布于[github](https://github.com/bg6cq/nginx-install)。 * **中国科学技术大学 张焕杰** * **厦门大学 郑海山** 吴大军 修改时间:2026.1.29 对于仅仅支持IPv4的HTTP服务器,按下图所示步骤,通过增加Nginx反向代理服务器,可以分三步迁移为支持IPv4/v6 协议的HTTP、HTTPS、HTTP/2服务器。 步骤一--步骤十 描述了第一步的迁移过程。第二步迁移仅仅需要修改DNS服务器即可。 步骤十一 描述了第三步的迁移过程。 Nginx反向代理服务器是高性能的HTTP/HTTPS/TCP代理软件,单台服务器很轻松支持10万+并发连接。[中国科学技术大学](https://www.ustc.edu.cn)负责处理600余个网站的Nginx服务器大部分时间并发连接2000左右,也就是说1台Nginx服务器完全可以满足一个学校的所有网站使用。 Nginx在进行反向代理时,发给HTTP服务器的请求,增加了以下字段: * X-Real-IP: 客户端来源IP地址 * X-Forwarded-Proto: 用户请求的协议,是http或https 特别注意:如果您的HTTP服务器前有WAF设备防护,增加Nginx服务器后,WAF设备看到的访问来源IP是Nginx服务器的IP地址,而不是真实的客户端IP地址。 一旦WAF设备认为有攻击嫌疑而封锁IP,会导致Nginx服务器无法访问HTTP服务器。因此需要调整WAF设备的配置,让WAF设备把HTTP请求中的X-Real-IP字段作为来源IP地址。 ![ipv6 trans](images/steps.png) ## 一、Ubuntu 24.04 LTS安装 获取安装包 ISO,您可以从以下站点获取 `ubuntu-24.04.2-live-server-amd64.iso`,大小是3G。 * [中国科大镜像站](https://mirrors.ustc.edu.cn/ubuntu-releases/24.04/ubuntu-24.04.2-live-server-amd64.iso) * [上海交大镜像站](http://ftp.sjtu.edu.cn/ubuntu-cd/24.04/ubuntu-24.04.2-live-server-amd64.iso) * [163镜像站](http://mirrors.163.com/ubuntu-releases/24.04/ubuntu-24.04.2-live-server-amd64.iso) ### 系统要求 - **操作系统**: Ubuntu 24.04 LTS (不再支持旧版本) - **内存**: 最小2GB,推荐4GB以上 - **存储**: 最小20GB可用空间 - **网络**: 需要IPv4和IPv6双栈支持 安装完的系统占用磁盘空间为3.5G。使用物理服务器或新建虚拟机都可以。如果使用虚拟机,选择4个虚拟CPU,2G内存,40G硬盘(如果想保存更多日志可以适当加大空间)一般就够用,类型可以选Ubuntu Linux(64-bit)。 使用光盘镜像引导,按提示安装即可,一般在10分钟内完成。安装过程中有疑问,请参考 [Ubuntu 24.04 Server 版安装过程图文详解](https://support.huawei.com/enterprise/zh/doc/EDOC1100524442/bae24b9b)。 如果安装时设置了网络,安装过程中会连接官方服务器获取最新的软件包,因此请保持网络畅通。 如果安装时没有设置网络,请参见下面的 二、配置网络 部分。 注意:Ubuntu 系统要求必须使用一个普通用户登录,执行需要特权的命令时,使用`sudo ....`来临时切换为root用户进行。如果需要以root身份执行较多的命令,可以使用`sudo su -`切换为root用户(虽然不建议这样做),这样一来就不需要每次输入`sudo`了。 ## 二、配置网络 反向代理服务器需要IPv4/IPv6的连通性,对外需要开放22、80、443端口,如果您有防火墙,请放开这些端口。 使用安装时设置的普通用户登录系统,使用以下命令测试网络是否正常: ```bash ip addr #查看网卡设置的ipv4/ipv6地址 ip route #查看ipv4网关 ip -f inet6 route #查看ipv6网关 ping 202.38.64.1 #检查ipv4连通性 ping6 2001:da8:d800::1 #检查ipv6连通性 ``` 如果网络存在问题,请按照以下说明修改配置,直到网络正常。 Ubuntu网络配置与之前的变化较大,采用netplan管理,配置文件存放在`/etc/netplan/*.yaml`。 下面是我使用的例子,文件是`/etc/netplan/50-cloud-init.yaml`,内容如下: 请根据自己的网络情况,修改文件,修改后执行`sudo netplan apply`应用即可。 ``` network: version: 2 ethernets: ens160: addresses: - 192.168.1.18/24 - 2001:da8:1:2::18/64 routes: - to: default via: 192.168.1.254 metric: 100 - to: default via: 2001:da8:1:2::1 metric: 100 nameservers: addresses: [223.5.5.5, 2001:da8::666] ``` 检查点:上述ping之类的命令测试网络正常。 网络正确配置后,可以从其他机器ssh连接Nginx服务器,以方便后续操作时,通过"拷贝-粘贴"运行命令。 ## 注意:以下 步骤三--步骤七 部分有快捷脚本可用,下载后执行即可全部完成,大大节省时间,请参见 十、快捷脚本 ## 三、设置系统时区 默认安装的系统时区是UTC,以下命令可以修改为北京时间: ``` sudo timedatectl set-timezone Asia/Shanghai ``` ## 四、设置防火墙 安全是第一要务,对于Nginx服务器,对外需开通80、443端口,对部分地址开通22端口以方便管理。 使用如下命令设置,请根据自己的管理地址段,替换下面的`202.38.64.0/24` ```bash sudo ufw allow 80/tcp comment 'HTTP' sudo ufw allow 443/tcp comment 'HTTPS' sudo ufw allow from 202.38.64.0/24 to any port 22 comment 'SSH for Admin Network' sudo ufw allow proto ipv6-icmp comment 'ICMPv6 for ND' # 允许必要的ICMPv6协议 sudo ufw allow proto ipv6-icmp comment 'ICMPv6邻居发现' # 更明确的默认策略 sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw enable ``` 您可以使用命令`sudo ufw status numbered`查看设置的规则,如果设置错误,可以使用`sudo ufw delete [序号]`删除规则。 如果您有强烈的好奇心,可以执行`sudo iptables -L -nv | more`看看系统实际使用的规则。 检查点:命令`sudo ufw status verbose`能看到设置的规则。 ## 五、系统性能优化 为了确保Nginx反向代理服务器能够处理高并发连接,我们需要对系统进行性能优化。以下优化基于Ubuntu 24.04 LTS和现代Linux内核。 ### 5.1 设置文件描述符限制 Nginx需要能够打开大量文件描述符来处理并发连接。 创建systemd服务配置目录 ``` sudo mkdir -p /etc/systemd/system/nginx.service.d/ ``` 设置Nginx进程的文件描述符限制 ``` cat << EOF | sudo tee /etc/systemd/system/nginx.service.d/limit.conf [Service] LimitNOFILE=655360 EOF ``` 设置系统级别的文件描述符限制 ``` echo "fs.file-max = 655360" | sudo tee -a /etc/sysctl.conf ``` ### 5.2 现代内核网络优化 现代Linux内核(5.4+)已经统一了连接跟踪机制,不再需要单独加载IPv4/IPv6模块。我们使用sysctl进行优化: 创建优化的内核参数配置文件 ``` cat << 'EOF' | sudo tee /etc/sysctl.d/90-nginx-optimization.conf 网络核心参数优化 net.core.somaxconn = 65535 net.core.netdev_max_backlog = 65536 net.core.rmem_max = 134217728 net.core.wmem_max = 134217728 # 文件描述符和inode缓存 fs.file-max = 655360 fs.inotify.max_user_watches = 524288 # IPv4 TCP优化 net.ipv4.tcp_max_syn_backlog = 65536 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 60 net.ipv4.tcp_keepalive_probes = 3 # 连接跟踪优化(现代内核) net.netfilter.nf_conntrack_max = 400000 net.netfilter.nf_conntrack_buckets = 100000 net.netfilter.nf_conntrack_tcp_timeout_established = 600 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30 net.netfilter.nf_conntrack_udp_timeout = 30 net.netfilter.nf_conntrack_icmp_timeout = 10 # IPv6支持(确保双栈正常工作) net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0 net.ipv6.conf.all.forwarding = 1 # 内存管理优化 vm.swappiness = 10 vm.dirty_ratio = 15 vm.dirty_background_ratio = 5 EOF ``` ### 5.3 加载必要的网络模块 ``` # 确保ip_conntrack模块加载(现代内核中的统一模块) echo "nf_conntrack" | sudo tee -a /etc/modules echo "ipv6" | sudo tee -a /etc/modules # 对于虚拟化环境,优化网络性能 if [[ $(systemd-detect-virt) != "none" ]]; then echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.d/90-nginx-optimization.conf echo "优化了虚拟化环境下的内存设置" fi ``` ### 5.4 应用优化设置 ``` # 重新加载systemd配置 sudo systemctl daemon-reload # 应用sysctl设置 sudo sysctl -p /etc/sysctl.d/90-nginx-optimization.conf # 检查优化是否生效 echo "=== 优化设置验证 ===" echo "文件描述符限制: $(cat /proc/sys/fs/file-max)" echo "TCP连接队列: $(cat /proc/sys/net/core/somaxconn)" echo "连接跟踪最大值: $(cat /proc/sys/net/netfilter/nf_conntrack_max 2>/dev/null || echo '自动管理')" ``` ### 5.5 重启系统以应用所有优化 echo "系统性能优化配置完成。建议重启系统:sudo reboot" 检查点:重启后执行`dmesg | grep conn`会显示最大连接数为40万,`more /proc/sys/net/netfilter/*timeout*`会显示修改后的超时时间。 ## 六、安装Nginx 执行`sudo apt install -y nginx`即可。 ## 七、修改Nginx配置 建议使用Git跟踪配置的变化。 ### 7.1 使用如下命令初始化(请修改自己的个人信息): ```bash sudo su - git config --global user.email "james@ustc.educ.cn" git config --global user.name "Zhang Huanje" cd /etc/nginx git init git add * git commit -m init ``` ### 7.2 生成Nginx需要的随机数(需要大约几分钟以搜集足够的随机信息): ```bash sudo mkdir /etc/nginx/ssl sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 ``` ### 7.3 下载配置文件模板。我们准备了一份模板,下载后稍加修改就可以使用。 ``` cd /etc/nginx sudo mv nginx.conf nginx.system.conf sudo wget https://gitee.com/gmzd88/nginx-install/raw/master/nginx.conf ``` ### 7.4 修改配置文件sudo vi nginx.conf,主要调整server配置部分,改为自己的主机名、后端服务器IP地址。配置文件已包含SSL安全设置和性能优化,一般无需额外修改。 最后部分配置如下,请修改主机名、日志文件名、IP地址(IP地址是网站的IPv4地址) ``` server { listen 80 ; listen [::]:80 ; server_name www.ustc.edu.cn; access_log /var/log/nginx/host.www.ustc.edu.cn.access.log main; location / { proxy_pass http://202.38.64.99/; } } } ``` ### 7.5 测试配置是否正确,下面是测试正确时的显示: ``` sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful ``` ### 7.6 如果测试正确,执行以下命令应用配置: ```bash systemctl restart nginx.service ``` ## 八、测试 在自己机器上修改hosts文件,如下所示(请用自己服务器的IPv6地址替换): ``` 2001:da8:d800:381::200 www.ustc.edu.cn ``` 测试是否可以访问,并可以查看Nginx服务器上`/var/log/nginx/`下的日志文件,看到有访问记录。 ## 九、启用IPv6访问 经过测试访问正常后,可以修改DNS服务器上www.ustc.edu.cn的信息,增加 ``` www IN AAAA 2001:da8:d800:381::200 ```` 这样就能观察到IPv6的访问,您也可以到 [http://ipv6-test.com/validate.php](http://ipv6-test.com/validate.php) 处输入自己的网站地址测试IPv6的HTTP是否可以正常工作。 正常工作后,可以将配置文件的变更在git中提交,命令是: ```bash sudo su - cd /etc/nginx git add nginx.conf git commit -m "www.ustc.edu.cn ok" ``` 日志保留时间的调整,`vi /etc/logrotate.d/nginx`,把 ``` rotate 14 ``` 改为 ``` rotate 200 ``` 保留200天日志。或者自己写脚本每天定时转储日志。 ## 十、快捷脚本 以上 三---七 部分,有快捷脚本可用,只要完成"二、网络配置",网络畅通时,执行以下脚本即可完成大部分配置,只要修改配置文件即可。 注意,执行脚本时,请根据自己的信息替换命令行参数(命令行中202.38.95.0/24是将来允许使用ssh登录服务器的网段)。 ``` sudo su - cd / wget http://202.38.64.1/install-nginx.sh wget https://gitee.com/gmzd88/nginx-install/raw/master/install-nginx.sh bash ./install-nginx.sh 202.38.95.0/24 ``` 执行完脚本,重新启动,然后请参考 7.4 修改配置和后续工作 ## 十一、HTTPS支持 警告:上海交大 章思宇 老师提醒,如果仅仅使用Nginx处理IPv6流量并支持HTTPS访问,同时处理IPv4流量的服务器不支持HTTPS,这时开通IPv6流量的HTTPS可能会带来负面影响,原因是有些搜索引擎会通过v6收录HTTPS的链接,导致v4用户不能访问。 避免这种情况出现需要在v4/v6上同时支持HTTPS访问,其中最简单的方式是把所有流量经过Nginx代理。中国科大已经这样用了10多年,在一台Nginx服务器上对教育网、电信、联通、移动出口提供服务,运行稳定。 acme.sh 实现了 acme 协议,可以从 ZeroSSL,Let's Encrypt 等 CA 生成免费的证书。如果不愿意购买证书,完全可以满足大部分站点的使用。[acme.sh官方说明链接](https://github.com/acmesh-official/acme.sh/wiki/说明) 假定 http://testsite.ustc.edu.cn 已经由Nginx服务器代理,需要增加https支持,步骤如下: 注:以下命令均在root用户(`sudo su -`)后执行 ### 11.1 安装 acme.sh 安装很简单,一条命令: `curl https://get.acme.sh | sh -s email=my@example.com` 或者 `wget -O - https://get.acme.sh | sh -s email=my@example.com` my@example.com修改为自己的邮箱,注意需要能够访问到github。 安装后需要手动执行 `source ~/.bashrc` ### 11.2 生成证书 acme.sh 实现了 acme 协议支持的所有验证协议。一般有两种方式验证: HTTP 和 DNS 验证。 HTTP验证-Nginx模式 如果你用的 Nginx 服务器,或者反代,acme.sh 还可以智能的从 Nginx 的配置中自动完成验证,可以生成域名证书: `acme.sh --issue --nginx -d testsite.ustc.edu.cn -d next2.example.com` 你也可以使用 --listen-v6 参数强制通过IPv6验证 acme.sh 在完成验证之后,会恢复到之前的状态,都不会私自更改程序本身的配置. 好处是你不用担心配置被搞坏,也有一个缺点,你需要自己配置 SSL 项,否则只能成功生成证书,你的网站还是无法正常使用 HTTPS。 DNS 验证见官网说明: [DNS API 用法](https://github.com/acmesh-official/acme.sh/wiki/dnsapi) ### 11.3 复制证书 证书生成好以后,我们需要把证书复制给对应的Nginx 或其他服务器去使用。 ``` acme.sh --install-cert -d example.com \ --key-file /etc/nginx/ssl/testsite.ustc.edu.cn.key \ --fullchain-file /etc/nginx/ssl/testsite.ustc.edu.cn.pem \ --reloadcmd "service nginx reload" ``` 默认情况下,证书每 60 天会自动更新一次(可自定义)。更新证书后,Apache 或者 Nginx 服务会通过 reloadcmd 传递的命令自动重载配置。 ### 11.4 更新 acme.sh acme.sh 还在不断开发中,因此强烈建议保持并使用最新的版本。 手动升级: `acme.sh --upgrade` 开启自动升级: `acme.sh --upgrade --auto-upgrade` 关闭自动升级:`acme.sh --upgrade --auto-upgrade 0` ### 11.5 使用证书 ```bash server { listen 80; listen [::]:80; server_name testsite.ustc.edu.cn; # 自动重定向到HTTPS return 301 https://$server_name$request_uri; # ACME验证目录 location /.well-known/ { root /var/www/html; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name testsite.ustc.edu.cn; # SSL证书配置 ssl_certificate /etc/nginx/ssl/testsite.ustc.edu.cn.pem; ssl_certificate_key /etc/nginx/ssl/testsite.ustc.edu.cn.key; ssl_dhparam /etc/nginx/ssl/dhparam.pem; # 安全头部(配置模板已包含) access_log /var/log/nginx/host.testsite.ustc.edu.cn.access.log main; location / { proxy_pass http://202.38.64.40/; } } ``` 配置文件已包含以下安全特性: 现代TLS协议和密码套件 安全头部保护(HSTS、XSS防护等) HTTP/2支持 OCSP Stapling优化 ### 11.6 测试配置正常后,应用 ``` nginx -t && systemctl restart nginx.service ``` 这时可以通过 https://testsite.ustc.edu.cn 访问,也可以使用[SSL Labs](https://www.ssllabs.com/ssltest/analyze.html)测试网站的SSL得分情况。 正常工作后,可以将配置文件的变更在git中提交,命令是: ```bash sudo su - cd /etc/nginx git add nginx.conf git commit -m "https://testsite.ustc.edu.cn ok" ``` ### 11.7 强制用户使用https访问 上述设置,只要用户访问过 https://testsite.ustc.edu.cn ,在604800秒,即7天内,总是会用https方式访问。 如果HTTPS运行稳定,可以强制useragent带有Mozila/5.0(较新的浏览器)的访问强制使用https访问,将配置改为如下: ``` server { listen 80 ; listen [::]:80 ; server_name testsite.ustc.edu.cn; access_log /var/log/nginx/host.testsite.ustc.edu.cn.access.log main; location / { if ( $http_user_agent ~ "(Mozilla/5.0)" ) { return 301 https://$server_name$request_uri; } proxy_pass http://202.38.64.40/; } location /.well-known/ { root /etc/nginx/ssl/web/; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name testsite.ustc.edu.cn; ssl_certificate /etc/nginx/ssl/testsite.ustc.edu.cn.pem; ssl_certificate_key /etc/nginx/ssl/testsite.ustc.edu.cn.key; add_header Strict-Transport-Security $hsts_header; add_header Content-Security-Policy upgrade-insecure-requests; access_log /var/log/nginx/host.testsite.ustc.edu.cn.access.log main; location / { proxy_pass http://202.38.64.40/; } } ``` ## 十二、Nginx状态监视 新的配置模板已内置状态监控端点,无需额外安装软件。 ### 12.1 访问状态信息 配置文件包含本地监控端点,可通过以下地址访问: 基础状态:http://127.0.0.1:8080/nginx_status 健康检查:http://127.0.0.1:8080/health ### 12.2 调整访问权限(可选) 如需从外部访问,修改nginx.conf中的监控server块: ``` server { listen 8080; allow 192.168.1.0/24; # 添加您的管理网络 deny all; location /nginx_status { stub_status on; access_log off; } } ``` ## 十三、系统和软件的更新 一直到2029年,Ubuntu都会为 Ubuntu 24.04 LTS提供软件更新服务。只要执行以下命令,即可将系统中软件更新: ``` sudo apt update sudo apt upgrade ``` *** 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS)