Nginx技术记录
温馨提示:
本文最后更新于 2022年10月27日,已超过 918 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
1. 什么是nginx
中文文档-https://www.nginx.cn/doc/
Nginx 是一款轻量级的 HTTP 服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的反向代理和负载均衡。
2. nginx能干嘛?解决了什么难点?
- nginx做反向代理和负载均衡
- 做静态文件服务器
- 作为网关来使用,配合Lua做限流、熔断等控制。
- 。。。
2.Nginx安装
1. 安装gcc
yum -y install gcc
2. 安装pcre、pcre-devel
功能:为了重写rewrite
pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式,所以需要安装pcre库。
yum install -y pcre pcre-devel
3.zlib安装
功能:为了gzip压缩
zlib库提供了很多种压缩和解压缩方式nginx使用zlib对http包的内容进行gzip,所以需要安装
yum install -y zlib zlib-devel
4. 选择安装openssl
yum install -y openssl openssl-devel
5. 执行命令
./configure
make
make install
6. nginx配置到环境变量
vim /etc/profile
#最后一行加入:根据实际情况
PATH=$PATH:/usrex/local/nginx/sbin
export PATH
#配置立即生效
source /etc/profile
3. Nginx常用命令
1. nginx命令行参数
-c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的。
-t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
-v 显示 nginx 的版本。
-V 显示 nginx 的版本,编译器版本和配置参数。
2.nginx控制信号
可以使用信号系统来控制主进程。默认,nginx 将其主进程的 pid 写入到 /usr/local/nginx/nginx.pid 文件中。通过传递参数给 ./configure 或使用 pid 指令,来改变该文件的位置。
主进程可以处理以下的信号:
TERM, INT 快速关闭
QUIT 从容关闭
HUP 重载配置
用新的配置开始新的工作进程
从容关闭旧的工作进程
USR1 重新打开日志文件
USR2 平滑升级可执行程序。
WINCH 从容关闭工作进程
尽管你不必自己操作工作进程,但是,它们也支持一些信号:
TERM, INT 快速关闭
QUIT 从容关闭
USR1 重新打开日志文件
3.nginx 启动、停止、重启命令
1. nginx启动
sudo /usr/local/nginx/nginx (nginx二进制文件绝对路径,可以根据自己安装路径实际决定)
2.nginx从容停止命令,等所有请求结束后关闭服务
ps -ef |grep nginx
kill -QUIT nginx主进程号
3.nginx 快速停止命令,立刻关闭nginx进程
ps -ef |grep nginx
kill -TERM nginx主进程号
4.如果以上命令不管用,可以强制停止
kill -9 nginx主进程号
4.nginx重新 加载配置文件
nginx -s reload
4.Nginx配置
1. nging配置文件详解(来源nginx中文网)
#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
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 logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6].";
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#设定虚拟主机配置
server {
#侦听80端口
listen 80;
#定义使用 www.nginx.cn访问
server_name www.nginx.cn;
#定义服务器的默认网站根目录位置
root html;
#设定本虚拟主机的访问日志
access_log logs/nginx.access.log main;
#默认请求
location / {
#定义首页索引文件的名称
index index.php index.html index.htm;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}
2.静态配置文件解释 alias和root的区别
重点是理解alias与root的区别,root与alias主要区别在于nginx如何解释location后面的uri,这使两者分别以不同的方式将请求映射到服务器文件上。
1. alias(别名)是一个目录别名
location /123/abc/ {
alias /ABC;
}
当请求http://qingshan.com/123/abc/logo.png时,会返回 /ABC/logo.png文件,即用/ABC替换 /123/abc。
2. root(根目录)是最上层目录的定义。
location /123/abc/ {
root /ABC;
}
当请求http://qingshan.com/123/abc/logo.png时,会返回 /ABC/123/abc/logo.png文件,即用/ABC 加上 /123/abc。
3. nginx安装配置https
1. nginx安装ssl证书
nginx -V #大写的V检查nginx是否安装了ssl 如果没有安装,则进行安装
#1.进入到nginx的解压目录执行 /usr/local/nginx是nginx的安装目录
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
#2. 在nginx的解压目录执行make (不能执行make install 不然会将nginx重新安装)
make
#3. 执行完成后,会在解压目录生成一个objs文件夹,将文件夹下的nginx文件替换到安装目录下 /usr/local/nginx/sbin
cp xx/objs/nginx /usr/local/nginx/sbin/
#4 重启nginx检查即可
#如果提示nginx文件没有权限 则执行 sodu chmod -R 777 nginx
2. 配置nginx
进入腾讯云,搜索ssl,申请免费的ssl证书。通过后,将下载好的nginx证书文件,放到nginx对应目录进行配置
#来源 腾讯云文档
server {
#SSL 访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name cloud.tencent.com;
#证书文件名称
ssl_certificate cloud.tencent.com_bundle.crt;
#私钥文件名称
ssl_certificate_key cloud.tencent.com.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
#例如,您的网站运行目录在/etc/www下,则填写/etc/www。
root html;
index index.html index.htm;
}
}
3. 如果需要将http转到https则加入转发配置
server {
listen 80;
server_name cloud.tencent.com;
#将请求转成https
rewrite ^(.*)$ https://$host$1 permanent;
}
4.nginx反向代理
1.客户端访问服务端资源时,通过nginx进行代理转发。
好处:
- 隐藏真实的服务端,提高服务端安全性
- 实现简单的跨域
- 负载均衡
2.反向代理基础配置
server {
listen 80;
server_name www.tianyajuanke.top;
location / {
proxy_pass http://127.0.0.1:8080; #访问www.tianyajuanke.top。转到本机的8080端口
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
3.反向代理https
server {
listen 443 ssl;
server_name www.tianyajuanke.top;
#腾讯云申请的证书
ssl_certificate /usr/local/blog/ssl/tianyajuanke.top_bundle.crt;
ssl_certificate_key /usr/local/blog/ssl/tianyajuanke.top.key;
ssl_session_timeout 5m;
#ssl相关配置。
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8443;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
4. nginx负载均衡
1. 简单的负载均衡配置
# 负载均衡:设置访问域名gulimall
upstream gulimall {
server localhost:1000;
server localhost:1001;
}
server {
listen 80;
server_name 192.168.206.130;
location / {
proxy_pass http://gulimall; # 负载均衡配置,默认采用轮询负载方式
proxy_set_header Host $host:$server_port;
}
}
正文到此结束
- 本文标签: Linux
- 本文链接: https://www.tianyajuanke.top/article/30
- 版权声明: 本文由吴沛芙原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权