一文搞懂Nginx: 域名配置、SSL、HTTP转HTTPS

千层冷面 2024-09-18 14:07:02 阅读 100

本文将在Centos系统下详解Nginx服务器,从概念、下载、安装、编译、配置(含域名和证书)到启动。本文先讲Nginx如何使用,然后再谈概念。

一、实践

1. 下载

下载通常有2种方式:Centos自带的包管理工具、源码编译安装(推荐,拓展性强),本文使用源码编译安装的形式下载从Nginx官网(<code>nginx.org)下载Nginx的源代码。亦可以使用wget命令或者浏览器下载后通过FTP等方式传输到服务器上

wget http://nginx.org/download/nginx-latest.tar.gz

tar zxvf nginx-latest.tar.gz

cd nginx-x.y.z # 替换为下载的版本号

解压后的目录主要组成如下(如果下载的是nginx-1.24.2.tar.gz,解压后将得到一个名为nginx-1.24.2的目录):

auto/:包含配置脚本和检测脚本,用于在编译之前自动检测系统的配置和已安装的库。

conf/:包含Nginx的默认配置文件模板,如nginx.conf和koi-utf、koi-win、mime.types等文件。

contrib/:包含一些可选的补丁和工具,用于增强Nginx的功能。

html/:包含Nginx默认的HTML页面,如index.html和50x.html错误页面。

man/:包含Nginx的man手册页,提供Nginx命令和配置的详细文档。

src/:包含Nginx的源代码文件,这是编译Nginx时最核心的部分。

configure:一个脚本,用于配置Nginx的编译选项。运行此脚本后,它会检查你的系统环境,并创建一个Makefile文件,该文件包含了编译Nginx所需的命令和选项。

插一点课外知识:wget和yum(centos中最常用的包管理工具,还有RPM、DNF、APT等)

功能:wget主要用于下载文件,而yum则用于软件包管理。

使用场景:wget适用于需要下载文件或网页内容的场景;yum则适用于需要安装、更新或删除软件包的场景。

依赖关系:wget下载文件时不涉及依赖关系问题;yum在安装软件包时会自动处理依赖关系。

协议支持:wget支持HTTP、HTTPS和FTP协议;yum主要用于处理RPM包,但背后的软件源可能支持多种协议来下载软件包。

2. 安装依赖项

根据你的Linux发行版,安装Nginx编译所需的依赖项。例如,在基于Debian的系统上,你可以使用apt-get;在基于Red Hat的系统上,使用yum或dnf。

# Debian/Ubuntu

sudo apt-get update

sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g-dev libssl-dev

# CentOS/RHEL

sudo yum install gcc pcre-devel zlib-devel openssl-devel

依赖项介绍

GCC(GNU Compiler Collection)

作用:GCC是GNU项目的编译器套件,nginx的源码是用C语言编写的,因此需要GCC来编译这些源码。安装命令:在CentOS中,可以使用yum包管理器来安装GCC。命令如下:

yum install -y gcc gcc-c++

PCRE(Perl Compatible Regular Expressions)

作用:PCRE是一个Perl兼容的正则表达式库,nginx的HTTP模块使用PCRE来解析正则表达式,比如location指令中的正则表达式匹配。安装命令:同样使用yum包管理器安装PCRE及其开发库。命令如下:

yum install -y pcre pcre-devel

zlib

作用:zlib是一个广泛使用的数据压缩库,nginx使用zlib对HTTP包的内容进行gzip压缩,以减少网络传输量。安装命令:通过yum安装zlib及其开发库。命令如下:

yum install -y zlib zlib-devel

OpenSSL

作用:OpenSSL是一个强大的安全套接字层密码库,提供了SSL和TLS协议的实现。nginx支持HTTPS协议,因此需要OpenSSL来处理SSL/TLS加密。安装命令:使用yum安装OpenSSL及其开发库。命令如下:

yum install -y openssl openssl-devel

3. 配置、编译和安装Nginx

在编译之前,可以通过./configure脚本配置Nginx的编译选项。这包括指定安装目录、启用SSL支持等。注意此时应该在nginx解压后的源码目录中,存在configure可执行命令。

./configure \

--prefix=/usr/local/nginx # 指定新的Nginx安装目录

--with-http_ssl_module \ # 启用SSL支持

#--with-openssl=/path/to/openssl # 如果系统没有默认安装openssl或需要特定版本,可以指定openssl路径

# 其他需要的编译选项...

此例中安装到/usr/local/nginx目录下。

注意:./configure --help命令可以查看所有可用的编译选项。

继续执行make,此步骤将生成Nginx的可执行文件和其他必要的文件,这些文件将被放置在源代码目录的objs子目录中。

make

继续执行make install命令将Nginx安装到之前指定的目录:

make install

编译安装后,Nginx的工作目录/usr/local/nginx(即–prefix指定的目录)将包含以下主要子目录和文件:

conf:包含Nginx的配置文件,主要是nginx.conf。

html:包含Nginx默认的HTML文件,如index.html和50x.html。

logs:用于存放Nginx的日志文件,如访问日志和错误日志。

sbin:包含Nginx的可执行文件nginx。

4. 配置Nginx域名、SSL等

需要先申请域名和证书,通常可以去指定的机构网站申请,或者直接在腾讯等云服务器中申请。编辑Nginx的配置文件(通常位于–prefix指定的目录下的conf子目录中),此例中为/usr/local/nginx/conf/nginx.conf 。默认的配置文件长这样(加了注释)

# 设定运行Nginx的用户

user nginx;

# 根据系统CPU数量自动设置工作进程数

worker_processes auto;

# 错误日志的路径

error_log /var/log/nginx/error.log;

# PID文件的路径

pid /run/nginx.pid;

events {

# 每个工作进程允许的最大并发连接数

worker_connections 1024;

}

http {

# 引入MIME类型配置文件

include mime.types; # /usr/local/nginx/conf/mime.types

# 默认的MIME类型

default_type application/octet-stream;

# 定义日志格式

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模式,以减少磁盘I/O

sendfile on;

# 注释掉的tcp_nopush通常与sendfile一起使用,但在某些情况下可能不需要

#tcp_nopush on;

# 长连接超时时间

keepalive_timeout 65;

# 注释掉的gzip压缩,可以根据需要开启

#gzip on;

# 引入目录下所有的.conf文件

include /usr/local/nginx/conf.d/*.conf;

# 默认的server配置

server {

# 监听80端口,作为默认服务器

listen 80 default_server;

# 监听IPv6的80端口,作为默认服务器

listen [::]:80 default_server;

# 服务器名,这里使用_作为占位符

server_name _;

# 根目录的路径

root /usr/share/nginx/html;

# 引入目录下所有的.conf文件

include /usr/local/nginx/conf.d/*.conf;

# 匹配所有请求

location / {

# 这里可以添加处理请求的配置,例如代理、重定向等

# 当前为空,使用Nginx默认行为

}

# 404错误页面的配置

error_page 404 /404.html;

# 精确匹配/404.html的请求

location = /404.html {

# 这里也可以添加额外的配置,但当前为空

}

# 500、502、503、504错误页面的配置

error_page 500 502 503 504 /50x.html;

# 精确匹配/50x.html的请求

location = /50x.html {

# 同样,这里也可以添加额外的配置,但当前为空

}

}

}

在http模块下添加如下server

server {

listen 443 ssl;

server_name xxx.com www.xxx.com; # 替换为你的域名,前面不要加http或https,可配置多个域名(一级、二级、三级)

ssl_certificate /etc/nginx/ssl/yourdomain.crt; # 证书文件路径

ssl_certificate_key /etc/nginx/ssl/yourdomain.key; # 私钥文件路径

ssl_session_timeout 5m;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

ssl_protocols TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers on;

# 其他配置...

location / {

# 根目录或代理设置...

}

}

# 如果需要,也可以添加一个将HTTP重定向到HTTPS的配置

server {

listen 80;

server_name xxx.com;

return 301 https://$server_name$request_uri;

}

5. 运行

确保在nginx的安装目录, 此例中为/usr/local/nginx/,注意不是nginx的源码目录。

/usr/local/nginx/sbin/nginx

查看是否已启动。

nginx -V

注意:-V(大写V)是用于显示Nginx的版本信息和编译参数,而-v(小写v)仅显示Nginx的版本号。

6. 监控

创建软连接以便随处可以执行nginx命令。

sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

使用Nginx的命令行工具(如nginx、nginx -s reload、nginx -s stop等)来管理Nginx服务的启动、停止和重新加载配置。ps命令用于显示当前系统中的活动进程。要查找Nginx进程,可以使用grep命令来过滤输出。

ps aux | grep nginx

如果知道Nginx正在监听哪个端口(通常是80或443),可以使用netstat或ss命令来检查哪个进程正在监听该端口。

netstat -tulnp | grep :80

二、理论

1. 概念

Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。它由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发,并以类BSD许可证的形式发布其源代码。Nginx因其稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。

2. 特性

高性能:Nginx采用高效的异步事件驱动模型,使得其能够处理大量的并发连接,并且在高负载环境下依然能够保持高性能。

高可靠性:Nginx具有强大的错误处理机制,能够确保在出现错误时依然能够正常提供服务。

模块化设计:Nginx的模块化设计使得其具有良好的扩展性,可以方便地添加或移除功能模块。

低内存消耗:Nginx在运行时占用的内存资源相对较少,这对于资源有限的服务器环境来说尤为重要。

热部署:Nginx支持在不中断服务的情况下进行配置文件的修改和版本升级。

3. 功能

静态文件服务:Nginx可以作为静态文件服务器,高效地处理图片、CSS、JavaScript等静态资源的请求。

反向代理:Nginx可以作为反向代理服务器,将客户端的请求转发到后端的Web服务器上,同时提供负载均衡、缓存等功能。

负载均衡:Nginx支持多种负载均衡算法,如轮询、权重等,能够将客户端的请求分发到多个后端服务器上,提高系统的整体性能和可靠性。

邮件代理:Nginx还提供了IMAP/POP3/SMTP代理服务,可以作为邮件服务器的代理服务器。

4. 应用场景

Web服务器:Nginx可以作为独立的Web服务器,处理HTTP和HTTPS协议的请求。

反向代理和负载均衡:Nginx可以作为反向代理服务器,将客户端的请求转发到后端的Web服务器上,并提供负载均衡功能。

动静分离:在企业应用中,Nginx常用于动静分离,将静态资源(如图片、CSS、JavaScript等)和动态资源(如JSP、PHP页面等)分开处理,以提高系统的响应速度和性能。

HTTPS加速:Nginx支持SSL/TLS协议,可以用于HTTPS的加速和优化。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。