Nginx概述
1. 简介
- Nginx 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。
- 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
- Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强。
Nginx安装
安装规划
OS: RHEL/CentOS 7/8
Software: nginx-1.19.6
1. 新建运行Nginx服务的用户
-
创建运行nginx的用户组
# groupadd -g 10001 nginx
-
创建运行nginx的用户
# useradd -u 10001 -g nginx -M -s /bin/false nginx
2. 准备与规划
- 目录规划
No. | 说明 | 路径 |
---|---|---|
1 | 源码目录 | /root/packages/ |
2 | 安装目录 | /opt/lnmp/nginx-1.19.6/ |
3 | 日志目录 | /var/log/nginx |
4 | web应用目录 | /data/webapps/ |
-
创建目录
# mkdir -p /root/packages/ # mkdir -p /opt/lnmp/nginx-1.19.6/ # mkdir -p /var/log/nginx/ # mkdir -p /data/webapps/ # chown -R nginx:nginx /var/log/nginx/
-
获取nginx源码包
# cd /root/packages/
# wget http://nginx.org/download/nginx-1.19.6.tar.gz
-
设置进程所占用的资源(可选)
# ulimit -SHn 65535
此方法在重启后失效,下面三种方法永久生效- 在/etc/rc.local 中增加一行 ulimit -SHn 65535
- 在/etc/profile 中增加一行 ulimit -SHn 65535
- 在/etc/security/limits.conf最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535
编译安装
1. 安装依赖包/库
- 基本编译工具及库文件
# yum -y install gcc gcc-c++ autoconf automake make
- 安装pcre库;rewrite模块需要 pcre 库。
# yum install pcre pcre-devel -y
- 安装openssl
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用;nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要安装 OpenSSL 库。
# yum install openssl openssl-devel -y
- gzip 类库安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要安装 zlib 库。
# yum install zlib zlib-devel
- 其他依赖包
# yum install -y libxml2 libxml2-devel libxslt-devel gd-devel
2. 源码编译安装nginx
-
Makefile文件生成
# cd /root/packages/ # tar zxvf nginx-1.19.6.tar.gz # cd nginx-1.19.6/ # ./configure --prefix=/opt/lnmp/nginx-1.19.6/ \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --user=nginx \ --group=nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-pcre \ --with-http_xslt_module \ --with-http_image_filter_module \ --with-http_image_filter_module=dynamic \ --with-http_xslt_module=dynamic \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-stream \ --with-stream_ssl_module \ --with-http_v2_module
- 注:详细参数请执行
# ./configure --help
查看
- 注:详细参数请执行
-
编译
# make
-
安装(注意权限)
# make install
环境变量及systemd
1. 环境变量配置
-
软连接Nginx安装目录(方便访问和后期升级是配置)
# ln -s /opt/lnmp/nginx-1.19.6/ /opt/lnmp/nginx
-
加入环境变量
# echo 'export PATH=/opt/lnmp/nginx/sbin/:$PATH' >> /etc/profile
-
测试
# source /etc/profile # nginx -v nginx version: nginx/1.19.6
-
启动
# nginx
-
Nginx 其他命令
- 检查配置文件语法是否有错:
nginx -t
- 重新载入配置文件:
nginx -s reload
- 重启 Nginx:
nginx -s reopen
- 停止 Nginx:
nginx -s stop
- 检查配置文件语法是否有错:
2. 使用systemd管理Nginx服务
-
在系统服务目录里创建nginx.service文件
# vi /usr/lib/systemd/system/nginx.service # cat /usr/lib/systemd/system/nginx.service [Unit] Description=nginx - high performance web server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/opt/lnmp/nginx/sbin/nginx ExecReload=/opt/lnmp/nginx/sbin/nginx -s reload ExecStop=/opt/lnmp/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target
-
使用systemctl命令管理Nginx服务
# systemctl start nginx //启动Nginx服务,注意如果执行nginx命令启动了服务,需停止nginx -s stop停止后执行此命令,否则报错 # systemctl status nginx //查询nginx服务状态 ● nginx.service - nginx - high performance web server Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2021-01-20 14:57:25 CST; 1s ago Process: 5090 ExecStart=/opt/lnmp/nginx/sbin/nginx (code=exited, status=0/SUCCESS) Main PID: 5091 (nginx) CGroup: /system.slice/nginx.service ├─5091 nginx: master process /opt/lnmp/nginx/sbin/nginx └─5092 nginx: worker process Jan 20 14:57:25 localhost.localdomain systemd[1]: Starting nginx - high performance web server... Jan 20 14:57:25 localhost.localdomain systemd[1]: Started nginx - high performance web server. # systemctl stop nginx //停止Nginx服务 # systemctl enable nginx //开机自启动Nginx服务 # systemctl disable nginx //关闭开启自启动Nginx服务
Nginx配置
Nginx 基础配置
1. Nginx主配置文件
-
配置nginx的主配置文件nginx.conf,虚拟主机既可以配置在nginx.conf文件,也可以通过”include“参数指定到某个目录,这里配置为指定到其他目录的方式配置,此方式对于多站点的管理比较方便,且配置文件结构更简单。
[root@node1 ~]# cat /opt/lnmp/nginx/conf/nginx.conf # Nginx用户及用户组。window下不指定 user nginx nginx ; # 工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。 worker_processes 8; # 错误日志:存放路径。 error_log /var/log/nginx/error.log; error_log /var/log/nginx/error.log notice; error_log /var/log/nginx/error.log info; # pid(进程标识符):存放路径。 pid logs/nginx.pid; events { # 使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。 use epoll; # 工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为:worker_processes*worker_connections worker_connections 20480; } http { 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; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; gzip on; #所有的虚拟主机配置文件全部放在./vHost目录,注意这里的相对路径是nginx.conf配置文件所在的目录 include vHost/*.conf; }
-
补充说明:
与apache相似,nginx针对不同的操作系统,有不同的事件模型- 标准事件模型
Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll - 高效事件模型
- Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X。使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
- Epoll:使用于Linux内核2.6版本及以后的系统。
- Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
- 标准事件模型
2. Nginx配置虚拟主机
虚拟主机,也叫“网站空间”,就是把一台运行Nginx的主机划分成多个“虚拟”服务器,一个虚拟主机可以运行一个网站。
- Nginx配置虚拟主机支持3种方式:
- 基于IP的虚拟主机
- 基于端口的虚拟主机
- 基于域名的虚拟主机
-
这里配置一个虚拟主机,配置文件为
/opt/lnmp/nginx/conf/vHost/www.test.com.conf
[root@node1 ~]# cat /opt/lnmp/nginx/conf/vHost/www.test.com.conf server { listen 80; server_name 192.168.1.129; # 访问日志 access_log /var/log/nginx/www.test.com.access.log main; location / { # 虚拟主机root目录,及网站程序的放置目录 root /data/webapps/test/; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root /data/webapps/test/; } }
-
放置网站程序到虚拟主机root目录
1. 创建虚拟主机的root目录 # mkdir /data/webapps/test/ 2. 拷贝nginx自带的网站测试程序到虚拟主机的root目录 # cp /opt/lnmp/nginx-1.19.6/html/* /data/webapps/test/ 3. 调整权限 # chown -R nginx:nginx /data/webapps/
3. 使更改后的配置文件生效
- 检查配置文件语法是否有错
# nginx -t
- 重新载入配置文件
# nginx -s reload
- 也可以重启nginx服务(非特殊情况不推荐使用)
- 有防火墙的请开通80端口或关闭防火墙,包括系统防火墙和物理防火墙
4. 测试
-
不想截图,就通过curl命令测试啦
# curl http://192.168.1.129 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
Nginx 配置 https
1.创建 SSL 证书
- 创建存放ssl证书的目录
# mkdir /etc/ssl/nginx
- 创建了有效期10年,加密强度为RSA2048的SSL密钥key和X509证书文件,证书信息可以随便填或者留空,只有Common Name要根据你的域名或ip填写。如xxx.com,或使用*.xxx.com匹配二级域名。
# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/nginx/nginx.key -out /etc/ssl/nginx/nginx.crt Generating a 2048 bit RSA private key ...................................+++ writing new private key to '/etc/ssl/nginx/nginx.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:Beijin Locality Name (eg, city) [Default City]:Beijin Organization Name (eg, company) [Default Company Ltd]:test Organizational Unit Name (eg, section) []:test Common Name (eg, your name or your server's hostname) []:192.168.1.129 Email Address []:test@msn.com
- 参数说明:
- req: 配置参数-x509指定使用 X.509证书签名请求管理(certificate signing request (CSR))."X.509" 是一个公钥代表that SSL and TLS adheres to for its key and certificate management.
- -nodes: 告诉OpenSSL生产证书时忽略密码环节.(因为我们需要Nginx自动读取这个文件,而不是以用户交互的形式)。
- -days 3650: 证书有效期,10年
- -newkey rsa:2048: 同时产生一个新证书和一个新的SSL key(加密强度为RSA 2048)
- -keyout:SSL输出文件名
- -out:证书生成文件名
2. 配置Nginx使用SSL
-
创建虚拟主机配置文件:
/opt/lnmp/nginx/conf/vHost/www.https.com.conf
# cat /opt/lnmp/nginx/conf/vHost/www.https.com.conf # HTTPS server server { listen 443 ssl; server_name 192.168.1.129; access_log /var/log/nginx/www.https.com.access.log; ssl_certificate /etc/ssl/nginx/nginx.crt; ssl_certificate_key /etc/ssl/nginx/nginx.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; location / { root /data/webapps/https/; index index.html index.htm index.php; } }
-
放置网站程序到虚拟主机root目录
1. 创建虚拟主机的root目录 # mkdir /data/webapps/https/ 2. 编写测试程序到虚拟主机的root目录 # # echo '<html><h1>nginx https test!</h1></html>' > /data/webapps/https/index.html 3. 调整权限 # chown -R nginx:nginx /data/webapps/https/
3. 使更改后的配置文件生效
- 检查配置文件语法是否有错
# nginx -t
- 重新载入配置文件
# nginx -s reload
- 有防火墙的请开通443端口或关闭防火墙,包括系统防火墙和物理防火墙
4. 测试
-
通过curl命令测试
# curl -k https://192.168.1.129 <html><h1>nginx https test!</h1></html> -k:允许curl使用非安全的ssl连接并且传输数据
FAQ's
编译安装FAQ's
Q1: 故障1
- 问题描述:执行
./configure
时报如下错误:
./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.
- 问题原因:
http_image_filter_module是nginx提供的集成图片处理模块,需要gd-devel的支持 - 问题解决:安装
gd-devel
# yum install -y gd-devel
Q2: 故障2
- 问题描述:执行
./configure
时报如下错误:
/configure: error: the HTTP rewrite module requires the PCRE library.
- 问题原因:缺少PCRE Library
- 问题解决:安装pcre
# yum -y install pcre pcre-devel
Q3: 故障3
- 问题描述:执行
./configure
时报如下错误:./configure: error: the HTTP cache module requires md5 functions from OpenSSL library. You can either disable the module by using --without-http-cache option, or install the OpenSSL library into the system,or build the OpenSSL library statically from the source with nginx by using --with-http_ssl_module --with-openssl=<path> options.
- 问题原因:缺少ssl错误
- 问题解决:安装openssl
# yum -y install openssl openssl-devel
Q4: 故障4
- 问题描述:执行
./configure
时报如下错误:
./configure: error: C compiler cc is not found
- 问题原因:缺少编译器
- 问题解决:安装gcc、gcc-c++
# yum -y install gcc gcc-c++ autoconf automake
Q5: 故障5
- 问题描述:执行
./configure
时报如下错误:./configure: error: the HTTP gzip module requires the zlib library. You can either disable the module by using –without-http_gzip_module option, or install the zlib library into the system, or build the zlib library statically from the source with nginx by using –with-zlib=<path> option.
- 问题原因:缺少zlib包
- 问题解决:安装zlib
# yum install -y zlib-devel
Q6: 故障6
- 问题描述:执行
./configure
时报如下错误:
./configure: error: the HTTP XSLT module requires the libxml2/libxslt libraries.
You can either do not enable the module or install the libraries.
- 问题原因:缺少libxml2
- 问题解决:
# yum install -y libxml2 libxml2-devel libxslt-devel
Q7: 故障7
- 问题描述:执行
./configure
时报如下错误:
./configure: error: perl module ExtUtils::Embed is required
- 问题原因:缺少ExtUtils
- 问题解决:
# yum -y install perl-devel perl-ExtUtils-Embed
Q8: 故障8
- 问题描述:执行
./configure
时报如下错误:
./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library.
- 问题原因:缺少GeoIP
- 问题解决:
# yum -y install GeoIP GeoIP-devel GeoIP-data
配置FAQ's
Q1: nginx网站服务器不显示图片
- 解决办法
在相应的虚拟主机配置文件,加入:location ~* ^.+\.(jpg|jpeg|gif|png|bmp)$ { access_log off; root /xxx/xxx #此处为您的网站路径; expires 30d; break; }
《LNMP网站服务器架构(一)之Nginx部署》文章由 执笔写快乐 发布在行动派博客,未经授权禁止转载。