Jacky's Blog Jacky's Blog
  • 首页
  • 关于
  • 项目
  • 大事记
  • 留言板
  • 友情链接
  • 分类
    • 干货
    • 随笔
    • 项目
    • 公告
    • 纪念
    • 尝鲜
    • 算法
    • 深度学习
首页 › 干货 › Nginx 安装配置指南

Nginx 安装配置指南

Jacky
9月 12, 2021干货阅读 1,959
目录
  1. 前言
  2. 安装
  3. 配置
    1. HTTP
    2. HTTPS
    3. HTTP 与 HTTPS 共存
    4. HTTP 强制跳转 HTTPS
    5. HTTP/2
    6. 静态资源
    7. 反向代理
    8. 反向代理启用 WebSocket
    9. PHP-FPM 的 FastCGI 部署
  4. 反向代理高并发优化

前言

Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。

Nginx的编写有一个明确目标就是超越Apache Web服务器的性能。Nginx提供开箱即用的静态文件,使用的内存比Apache少得多,每秒可以处理大约四倍于Apache的请求。 在低并发下Nginx的性能与Apache相当(有时候还低于),但是在高并发下Nginx能保持低资源低消耗高性能。Nginx的优点还包括:高度模块化的设计,模块编写简单,以及配置文件简洁。

本文主要介绍在 Debian 系(如 Ubuntu,Debian)操作系统上如何安装及配置 Nginx。

安装

apt install nginx

配置

配置文件在 /etc/nginx 中,按照官方的指南,配置文件目录下的 sites-available 文件夹存放网站的配置文件, sites-enabled 文件夹用来存放启用的网站配置文件(通过软连接的方式)。

比如 sites-available 文件夹下有一个 jackyu.cn 的配置文件,如果我们要将他装载到 Nginx 中,则通过

ln -s /etc/nginx/sites-available/jackyu.cn /etc/nginx/sites-enabled/jackyu.cn

重载配置文件前,通过 nginx -t 检查配置文件是否有误,再使用 nginx -s reload 重载。

HTTP

server {
    listen	80;
    listen	[::]:80;

    server_name	<域名>;
}

HTTPS

server {
    listen	443 ssl;
    listen	[::]:443 ssl;

    server_name	<域名>;
    ssl_certificate	<证书路径>;
    ssl_certificate_key	<私钥路径>;
}

HTTP 与 HTTPS 共存

server {
    listen	80;
    listen	[::]:80;

    server_name	<域名>;
}

server {
    listen	443 ssl;
    listen	[::]:443 ssl;

    server_name	<域名>;
    ssl_certificate	<证书路径>;
    ssl_certificate_key	<私钥路径>;
}

HTTP 强制跳转 HTTPS

使用 307 Temporary Redirect 强制跳转,保留方法,避免 POST http 地址时 301 Moved Permanently 导致 POST 方法跳转之后变成 GET 方法。

server {
    listen	80;
    listen	[::]:80;

    return 307 https://$server_name$request_uri;
}

server {
    listen	443 ssl;
    listen	[::]:443 ssl;

    server_name	<域名>;
    ssl_certificate	<证书路径>;
    ssl_certificate_key	<私钥路径>;
}

HTTP/2

server {
    listen	443 ssl http2;
    listen	[::]:443 ssl http2;

    server_name	<域名>;
    ssl_certificate	<证书路径>;
    ssl_certificate_key	<私钥路径>;
}

静态资源

server {
    listen	443 ssl http2;
    listen	[::]:443 ssl http2;

    server_name	<域名>;
    ssl_certificate	<证书路径>;
    ssl_certificate_key	<私钥路径>;

    root <静态资源的文件夹路径>;
    index <首页文件名>;
}

反向代理

server {
    listen	443 ssl http2;
    listen	[::]:443 ssl http2;

    server_name	<域名>;
    ssl_certificate	<证书路径>;
    ssl_certificate_key	<私钥路径>;

    location /api/	 {
	proxy_pass         http://127.0.0.1:9001/;
	proxy_redirect     off;

	proxy_set_header   Host                 $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 or https
        client_max_body_size 1000m; # 上传文件大小限制 1000m
    }
}

上述配置将会把访问时的 /api/<接口地址> 反向代理到服务器本地 9001 端口 /<接口地址>

如果不需要子目录反向代理,将 location /api/ 改为 location / 即可

反向代理启用 WebSocket

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen	443 ssl http2;
    listen	[::]:443 ssl http2;

    server_name	<域名>;
    ssl_certificate	<证书路径>;
    ssl_certificate_key	<私钥路径>;

    location /api/	 {
	proxy_pass         http://127.0.0.1:9001/;
	proxy_redirect     off;

	proxy_set_header   Host                 $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 or https

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        client_max_body_size 1000m; # 上传文件大小限制 1000m
    }
}

PHP-FPM 的 FastCGI 部署

location ~ [^/]\.php(/|$) {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
}

反向代理高并发优化

具体配置需要根据压力测试结果进行调节

worker_processes auto;
events {
	worker_connections   8096;
	multi_accept         on;
        use                  epoll;
}

worker_processes 是 nginx 运行时启用的进程数量,默认为 auto,可以设置为CPU的核心数或线程数。

对于 Nginx 与后端服务、MySQL 存放在一台服务器上的时候如果 Nginx 进程开的太多,在高并发的时候会与 MySQL 或后端服务竞争 CPU 资源,如下图

Nginx 安装配置指南-Jacky's Blog

在测试中,双核心处理器只启用 1 个 worker,增大连接数,压力测试出的并发数量甚至会有不少提升,不过一般保持 auto 就行。

文章最后修订于 2022年6月22日

赞(5)
本文系作者 @Jacky 原创发布在 Jacky's Blog。未经许可,禁止转载。
Vue CLI 生成构建号
上一篇
Gin WebSocket 消息推送
下一篇
再想想
暂无评论
近期评论
  • Jacky发表在《Nginx UI》
  • daiwenzh5发表在《Nginx UI》
  • Jacky发表在《Nginx UI》
  • daiwenzh5发表在《Nginx UI》
  • Jacky发表在《Nginx UI》
5
  • 5
  • 0
Copyright © 2016-2023 Jacky's Blog. Designed by nicetheme.
粤ICP备16016168号-1
  • 首页
  • 关于
  • 项目
  • 大事记
  • 留言板
  • 友情链接
  • 分类
    • 干货
    • 随笔
    • 项目
    • 公告
    • 纪念
    • 尝鲜
    • 算法
    • 深度学习
# Mac # # Apple # # OS X # # iOS # # macOS #
Jacky
PHP C C++ Python | 舞象之年 | 物联网工程
174
文章
169
评论
267
喜欢