介绍
Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应
作为负载均衡服务器 :Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
方便卸载并发,延迟处理,SSL(安全套接字层),静态内容,压缩和缓存,连接和请求限制所需的关键功能,甚至可以从应用程序中传输HTTP媒体流层到更有效的Web服务器层
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器 ,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
常使用:
Web服务器:Nginx 首先是一个 Web 服务器,用于托管网站内容,包括静态内容(如 HTML 文件、图片等)和动态内容(通过代理到后端应用服务器)。
反向代理:Nginx 常用作反向代理服务器,它可以接收来自 Internet 的请求并转发到内部网络的后端服务器(如应用服务器、API 服务器等),然后将响应返回给客户端。这个过程包括负载均衡、SSL 终止、缓存、压缩等优化响应的功能。
内容缓存:Nginx 可以缓存后端服务器的响应,减少对后端服务器的请求,提高响应速度。
负载均衡:Nginx 可以在多个后端服务器之间分配请求,提高网站的可用性和响应速度。
Nginx 主要工作在应用层 ,提供 HTTP 相关的服务,而 NAT 主要工作在网络层,处理 IP 地址的映射和转换。
安装
ubuntu安装:
bash
sudo apt install nginx
sudo systemctl status nginx
相关重要文件位置
直接输入whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz
ubuntu安装位置:
安装后的目录结构为:
所有的配置文件都在/etc/nginx下 ,虚拟主机在/etc/nginx/sites-available
程序文件在/usr/sbin/nginx
日志放在了/var/log/nginx
并已经在/etc/init.d/下创建了启动脚本nginx
默认的虚拟主机的目录设置在了/var/www/html
修改完nginx.conf文件后:
bash
/etc/nginx/nginx.conf
sudo nginx -t
sudo systemctl reload nginx
nginx -s signal
bash
信号的值可以是以下之一:
- `quit` -- 正常地关闭
- `reload` -- 重新加载配置文件
- `reopen` -- 重新打开日志文件
- `stop` -- 立即关闭(快速关闭)
命令解释
bash
user root;
这条指令设定了 Nginx 工作进程运行的用户身份。在这里,user root 指的是 Nginx 的工作进程将以 root 用户的权限运行。
运行 Nginx 作为 root用户通常不推荐,特别是在生产环境中,因为这会增加安全风险。如果工作进程受到攻击,攻击者可能会获得 root 用户的完全系统访问权限。
bash
worker_processes auto;
worker_processes指定了 Nginx 将启动多少个工作进程来处理请求。设置为 auto表示 Nginx 将自动根据可用的 CPU 核心数量来启动相应数量的工作进程。
这个设置是优化性能的关键,因为它允许 Nginx 平行处理更多的连接和请求。
bash
error_log /var/log/nginx/error.log;
这个指令指定了 Nginx 的错误日志文件的位置。在这里,所有的错误信息将被记录到 /var/log/nginx/error.log。
错误日志对于诊断和解决运行时问题非常重要,因为它提供了关于服务器错误和配置问题的详细信息。
bash
pid /run/nginx.pid;
这条指令设置了 Nginx 主进程的 PID(进程标识符)文件的存放路径。这个文件包含了 Nginx 主进程的进程号。
PID 文件通常用于脚本控制,如启动、停止和重启服务。通过读取这个文件中的进程号,管理脚本可以准确地发送信号到 Nginx 主进程。
events块设置影响 Nginx 的网络连接处理。其中的 worker_connections 指令指定了每个 worker 进程允许的最大同时打开的连接数。这个数字不直接对应于用户数,而是指单个工作进程可以同时处理的网络连接的数量。这里是配置的详细解释:
bash
worker_connections 1024;
- 1024 是这个指令设定的值,意味着每个工作进程可以同时管理最多 1024 个连接。这包括来自客户端的请求连接以及到上游服务器的连接(如果 Nginx 用作反向代理)。
用户连接数与 worker_connections 的关系:
连接数:一个用户可能会打开多个连接到服务器(例如,浏览一个 HTTPS 网页通常会开启多个 TCP 连接来加载页面上的资源)。因此,worker_connections的数值并不直接等于服务的最大用户数。
多进程:Nginx 通常配置为多进程运行(由 worker_processes
指令控制)。如果你的服务器配置了多个 worker 进程(例如,设置为 auto
或指定一个数值),总的可处理连接数将是单个进程的 worker_connections
值乘以进程数。
总体性能影响:
性能与资源:worker_connections 的最优设置依赖于服务器的硬件资源(如 CPU 和内存)、网络环境和具体的负载类型。过高的值可能会使系统资源耗尽,而过低的值可能会导致未充分利用系统资源。
配置示例:如果你的服务器配置了 worker_processes 4;并且每个进程的 worker_connections设置为 1024,那么你的服务器总共可以处理 4 × 1024 = 4096 个同时打开的连接。
http { ... } 块用于封装所有与 HTTP 相关的配置指令。这个块是 Nginx 处理 HTTP 请求的核心配置区域,其中可以包括服务器的监听设置、位置块(location)、MIME 类型定义、日志定义、以及其他与 HTTP 服务相关的多种指令。
【MIME 类型:(多用途互联网邮件扩展类型,MIME standing for Multipurpose Internet Mail Extensions)是一种标准,用来描述文件的内容类型 。这种类型标准在互联网上发送文件或数据时非常关键,因为它告诉接收系统或软件如何处理传入的数据。最初设计用于电子邮件系统,但后来在 HTTP 传输中也被广泛使用来描述网页中传输的数据类型。类型(Type):这是更广泛的类别,如 text、image、video、application 等。子类型(Subtype):这是在类型内部进一步定义数据的具体格式,例如 text/plain、text/html、image/jpeg、application/json 等】
bash
log_format main '$remote_addr - $remote_user [$time_local] "$request" '$status $body_bytes_sent "$http_referer" '"$http_user_agent" "$http_x_forwarded_for"';
- 这条指令定义了一个名为 main的日志格式。它指定了 Nginx 如何记录访问日志的每一条记录的格式:
$remote_addr
:客户端的 IP 地址。$remote_user
:如果使用 HTTP 基本认证,这里是认证的用户名。$time_local
:访问时间和时区。$request
:客户端的请求行。$status
:请求返回的状态码。$body_bytes_sent
:发送给客户端的字节数,不包括响应头。$http_referer
:引用页面。$http_user_agent
:客户端的用户代理。$http_x_forwarded_for
:代理服务器传递的原始客户端 IP。
样例nginx.conf
bash
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
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;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name www.yourdomain.cn;
return 301 https://test.yourdomain.cn;
}
server {
listen 443;
server_name www.yourdomain.cn;
ssl_certificate /etc/nginx/ssl/yourdomaincn.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomaincn-private.key;
return 301 https://test.yourdomain.cn;
}
server {
listen 80;
server_name test.yourdomain.cn;
return 301 https://yourdomain.cn$request_uri;
}
server {
listen 80;
listen [::]:80;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name test.yourdomain.cn;
ssl_certificate /etc/nginx/ssl/yourdomaincn.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomaincn-private.key;
gzip on;
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 1;
location / {
proxy_pass http://localhost:3008;
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;
}
}
server {
listen 443 ssl;
server_name testback.yourdomain.cn;
ssl_certificate /etc/nginx/ssl/yourdomaincn.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomaincn-private.key;
gzip on;
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 1;
location /static/ {
alias /home/syner/project/e-choice-backend/static/;
}
location ~* ^/media/(.+\.(jpg|jpeg|png|webp|svg|gif))$ {
alias /home/syner/project/e-choice-backend/media/$1;
}
location / {
proxy_pass http://localhost:8005;
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_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
client_max_body_size 101M;
}
}
server {
listen 443 ssl;
server_name yourdomain.cn;
ssl_certificate /etc/nginx/ssl/yourdomaincn.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomaincn-private.key;
gzip on;
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 1;
location / {
proxy_pass http://localhost:8898;
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;
}
}
}
域名与证书的配置:
bash
1. 购买Https证书,下载
2. 将形如 XXXX.crt, xxxxx.crt 的文件传到服务器上某个临时文件夹
3. 将私钥 generated-private-key.txt 传到服务器上临时文件夹
4. 使用以下命令,将两个证书文件合并
cat XXXX.crt XXXX.crt >> XXXX.crt
5. 将 generated-private-key.txt 重命名为 XXXXcrt.key
6. 使用以下命令检查文件开头是否包含 utf8 BOM
file XXXXcrt.key
7. 如果文件包含 utf8 BOM,使用以下命令去除
sudo sed -i '1s/^\xEF\xBB\xBF//' XXXXcrt.key
8. 将 XXXXcrt.key,XXXX.crt 拷贝到 **/etc/nginx/ssl** 文件夹下
9. 使用ll命令检查文件所有权,如果是root,则需要运行以下命令修改所有权
sudo chown nginx:nginx /etc/nginx/ssl/XXXX.crt
sudo chown nginx:nginx /etc/nginx/ssl/XXXXcrt.key
10. 使用如下命令修改私钥权限
sudo chmod 600 XXXXcrt.key