一文搞懂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的加速和优化。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。