介绍
Nginx是世界上第二大Web服务器,其他Web服务器有:Apache、Lighttpd、Tomcat、Jetty、IIS。
区别:
- Tomcat、Jetty面向Java语言,先天就是重量级的Web服务器,他们的性能与Nginx没有可比性;
- IIS只能在Windows操作系统上运行;
- Apache发展时期最长,是毫无争议的第一大Web服务器,然而它被设计为一个重量级的、不支持高并发的Web服务器,这决定了Apache不可能成为高性能Web服务器。
- Nginx是俄罗斯的Igor Sysoev用C语言开发的 跨平台的支持高并发的Web服务器,以性能为王。
特点:
- 更快。一方面单次请求将会得到更快的响应;另一方面 在数以万计的并发请求时,Nginx比其他Web服务器更快的响应请求。
- 高扩展性。它完全由不同功能、不同层次、不同类别且耦合度极低的模块组成。
- 高可靠性。nginx的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性。
- 低内存消耗。1万个非活跃的Http Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是nginx支持高并发连接的基础。
- 单机支持10万以上的并发连接。
- 热部署。7X24小时不间断的服务的前提下,升级nginx的可执行文件。
- 最自由的BSD许可协议。用户不仅免费使用nginx,而且可以参与修改源代码
选择Nginx的核心理由是:它能够在支持高并发请求的同时 保持高效的服务。Nginx先天的事件驱动型设计、全异步的网络I/O处理机制、极少的进程间切换以及许多优化设计,使得它天生善于处理高并发压力下的互联网请求。
安装和常用命令
以Linux(Ubuntu)为例,Nginx的软件包在Ubuntu默认软件仓库中可用。 安装非常简单,只需键入以下命令:
sudo apt update
sudo apt install nginx
安装后,配置文件默认位置 /etc/nginx/nginx.conf
安装完成后,请检查Nginx服务的状态和版本:sudo systemctl status nginx
查看版本:sudo nginx -v
- 使用systemctl管理Nginx服务
您可以像任何其他systemd单位一样管理Nginx服务。 要停止Nginx服务,请运行:sudo systemctl stop nginx
要再次启动,请键入:sudo systemctl start nginx
重新启动Nginx服务:sudo systemctl restart nginx
在进行一些配置更改后重新加载Nginx服务:sudo systemctl reload nginx
- 也可以使用service管理Nginx服务
停止Nginx服务,请运行:sudo service nginx stop
Nginx的配置
Nginx有很多的模块,这些模块可以帮助我们实现Web服务器上很多的功能。使用这些模块时,仅仅需要增加、修改一些配置项即可。
运行中的Nginx进程间的关系:部署Nginx时 都是使用一个master进程来管理多个worker进程,一般情况下,worker进程的数量与服务器上的CPU核心数相等。(这样进程间切换的代价是最小的)
配置的通用语法:
- 块配置项:{}括起来的
- 配置项的语法格式:配置项名 配置项值1 配置项值2 ; 【空格作为分隔符,多个值之间也是空格,最后以分号结尾】
- 配置项的注释:# 开头
Nginx服务的基本配置
基本配置是其他模块执行时都依赖的配置项。分为以下4类:
1、用于调试、定位问题的配置项;
(1) 是否以守护进程方式运行Nginx
daemon on|off 默认是on,且配置文件中不用写
(2)是否以master/worker方式工作
master_process on|off 默认是on
(3)error日志的设置
error_log logs/error.log error 【分别是 路径和级别,当设置为error级别时,debug和info的日志则不会输出到文件中】
2、正常运行的必备配置项;
(1)定义环境变量
env VAR= Value;
(2)嵌入其他配置文件
include /path/file; 可以将其他配置文件嵌入到当前的nginx.conf文件中,可以是绝对路径,也可以相对路径
(3)pid文件的路径
pid path/file; 保存master进程ID的pid文件存放路径。
默认:pid logs/nginx.pid;
(4)Nginx worker进程运行的用户及用户组
user ;username [groupname];
user用于设置master进程启动后,fork出的worker进程运行在哪个用户和用户组下。
默认:user nobody nobody;
3、优化性能的配置项;
(1)worker进程个数
worker_processes number;
默认 number=1 ,一般cpu核心数为几则设置为多少
(2)绑定worker进程到指定的CPU内核 。eg:
worker_processes 4;
worker_cup_affinity 1000 0100 0010 0001;
4、事件类配置项;
(1)每个worker的最大连接数
worker_connections number;
用HTTP核心模块配置一个静态Web服务器
静态Web服务器的主要功能有ngx_http_core_module模块(HTTP框架的主要成员)实现。Nginx为配置一个完整的静态Web服务器提供了非常多的功能,把这些配置项分为以下8类:
(1)虚拟主机与请求的分发
http块中的每个Server就是一个虚拟主机,它只处理与之对应的主机域名请求。所以以下配置均是在Server块中。
1、监听端口
默认:listen 80;
listen参数决定Nginx服务如何监听端口。在listen后可以只加IP地址、端口或者主机名,非常灵活。eg:
listen 127.0.0.1:8000;
listen 8000;
listen localhost:8000;
设置默认虚拟主机,listen后加default或者default_server,将所在的server块作为整个Web服务的默认server块。
2、主机名称
默认:server_name "";
可以设置多个主机名称,eg:server_name localhost www.testweb.com download.testweb.com;
在处理HTTP请求时,nginx会取出header头中的Host,与每个server中的server_name进行匹配,
3、location
语法:location [=|~|~*|^~|@] /uri/ {...}
location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择location{} 块中的配置来处理用户请求。
location / {
# 这个配置可以匹配所有请求
}
(2)文件路径的定义
1、以root方式设置资源路径
root path;
默认:root html;
配置块:http、server、location、if
eg:location /download {
root /opt/web/html;}
如果有一个请求的uri是/download/index/test.html,那么Web服务器将会返回服务器上/opt/web/html/download/index/test.html 文件的内容。
2、访问首页
index file...;
默认:index index.html;
eg:
location /{
root path;
index /index.html /html/index.php;} 请求的文件是path/index.html ,若不存在,则访问配置的第二个文件。
3、根据HTTP返回码重定向页面
例如:error_page 404 /404.html
(3)内存及磁盘资源的分配
用HTTP proxy module配置一个反向代理服务器
反向代理(reverse proxy)方式是指 用代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络中的上游服务器来处理。此时代理服务器对外的表现就是一个Web服务器。
Nginx通常可以配置为静态的Web服务器,也可以配置为反向代理服务器。
负载均衡的基本配置
作为代理服务器,一般都需要向上游服务器的集群转发请求。这里的负载均衡是指:选择一种策略,尽量把请求平均地分到每一台上游服务器上。
(1)upstream块
语法:upstream name {...}
配置块:http 即upstream是位于HTTP块中的
upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用。
eg:upstream backend{
server backend1.example.com;
server backend2.example.com;
}
(2)server
配置块:upstream块
语法:server name [parameters];
name可以是域名、ip地址端口;
参数,可以是 weight=number,设置这台上游服务器转发的权重,默认为1;
....
反向代理的基本配置
(1)proxy_pass
语法:proxy_pass URL;
配置块:location,if
将当前请求反向代理到URL参数指定的服务器上,可以是主机名 或者IP地址加端口,还可以是负载均衡的upstream块名,eg:proxy_pass http://backend;
默认情况下,反向代理是不会转发请求中的Host头部的。如果需要转发,那么必须加上配置:
proxy_set_header Host $host;
kill -9杀掉nginx主进程、reload失败解决办法
kill -9 5767 14801