Maison > Article > Opération et maintenance > Configuration du serveur Nginx et analyse d'exemples de configuration de base
nginx (engine x) est un serveur http et un serveur proxy inverse hautes performances. Ce logiciel a été développé pour résoudre le problème c10k. L'architecture de
nginx profite de nombreuses fonctionnalités du système d'exploitation moderne pour implémenter un serveur http hautes performances. Par exemple, sur les systèmes Linux, nginx utilise epoll, sendfile, file aio, directio et d'autres mécanismes, ce qui rend nginx non seulement très efficace, mais a également une très faible utilisation des ressources. Les responsables affirment que nginx n'a besoin que de 2,5 pour maintenir 10 000 http inactifs. connexions persistantes.
nginx exécutera plusieurs processus en même temps selon les besoins : un processus maître (master) et plusieurs processus de travail (worker). Lorsque le cache est configuré, il y aura également un processus de chargement de cache (cacheloader) et un cache. processus de gestion (gestionnaire de cache), etc. Tous les processus ne contiennent qu'un seul thread et la communication inter-processus est principalement réalisée via le mécanisme de « mémoire partagée ». Le processus principal s'exécute en tant qu'utilisateur root, tandis que les travailleurs, le chargeur de cache et le gestionnaire de cache doivent tous s'exécuter en tant qu'utilisateurs non privilégiés.
1. Installez nginx
Dans la version centos6 des sources epel, le package rpm de nginx a été ajouté, mais la version de ce package rpm est inférieure. Si vous devez mettre à jour la version, vous pouvez utiliser le package RPM officiellement produit ou utiliser le package de code source pour compiler et installer.
Vous pouvez également utiliser certaines versions de nginx avec des fonctions de développement secondaires améliorées, telles que tengine et openresty de Taobao, qui sont de bons choix.
1.1 Paramètres de compilation communs
--prefix=path : Spécifiez le répertoire d'installation de nginx
--conf-path=path : Spécifiez le chemin du fichier de configuration nginx.conf
--user=name : L'utilisateur du nginx work process
--with-pcre : Activer la prise en charge des expressions régulières pcre
--with-http_ssl_module : Activer la prise en charge SSL
--with-http_stub_status_module : Utilisé pour surveiller l'état de nginx
--with-http-realip_module : Autoriser la modification l'adresse IP du client dans l'en-tête de la requête
--with-file-aio : activer le fichier aio
--add-module=path : ajouter un module externe tiers
Une solution de compilation complète est fournie ici :
-- prefix=/usr /local/nginx
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path =/var/ log/nginx/access.log
--http-client-body-temp-path=/var/tmp/nginx/client_body
--http-proxy-temp-path=/var/tmp/nginx/ proxy
-- http-fastcgi-temp-path=/var/tmp/nginx/fastcgi
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
--pid-path=/var/run /nginx.pid
--lock-path=/var/lock/nginx
--user=nginx
--group=nginx
--with-file-aio
--with-http_ssl_module
--with-http_realip_module
--with- http_sub_module
--with-http_gzip_static_module
--with-http_stub_status_module
--with-pcre
1.2 Démarrage et arrêt de nginx
Démarrer nginx :
# nginx -c /etc/nginx/nginx.conf
Fermer nginx
# nginx -s stop
Relis le fichier de configuration
# nginx -s reload # pkill -hup nginx
Rouvrez le fichier journal
# nginx -s reopen # pkill -usr1 nginx
Vous pouvez également télécharger le fichier /etc/init.d/nginx dans le package nginx rpm et modifier le chemin pour utiliser :
# service nginx {start|stop|status|restart|reload|configtest|}
2.
Configuration nginx Le fichier est principalement divisé en quatre parties : main (paramètres globaux), http (paramètres généraux pour http), serveur (paramètres de l'hôte virtuel), emplacement (chemin d'URL correspondant). Il existe également d'autres sections de configuration, telles que événement, amont, etc.
2.1 Paramètres généraux
utilisateur nginx
Spécifiez l'utilisateur et le groupe exécutant le processus de travail nginx
worker_rlimit_nofile #
Spécifiez le nombre maximum de fichiers que tous les processus de travail peuvent ouvrir
worker_cpu_affinity
Définissez la rigidité du processeur du travailleur processus à éviter Processus Consommation de performances causée par la commutation entre les processeurs. Par exemple, work_cpu_affinity 0001 0010 0100 1000; (quad-core)
worker_processes 4
Le nombre de processus de travail peut être défini sur la même valeur que le nombre de processeurs. Si SSL et gzip sont activés, cette valeur peut être définie. augmenté de manière appropriée
worker_connections 1000
Le nombre maximum de connexions simultanées qu'un seul processus de travail peut accepter est placé dans le segment d'événements
error_log logs/error.log info
Le chemin de stockage et le niveau d'enregistrement du journal des erreurs
utilisez epoll
Utilisez le modèle d'événement epoll et est placé dans le segment d'événement
2.2 serveur http
serveur {} :
Définissez un hôte virtuel
écoutez 80 ;
Définissez l'adresse et le port d'écoute. Par défaut, il écoute sur. toutes les adresses de cette machine
nom_serveur nom [...];
Définissez le nom d'hôte virtuel, vous pouvez utiliser plusieurs noms, vous pouvez également utiliser des expressions régulières ou des caractères génériques.
sendfile on
Activez l'appel sendfile pour répondre rapidement au client
keepalive_timeout 65
Délai d'expiration de connexion long, en secondes.
send_timeout
Spécifiez le délai d'attente pour répondre au client
client_max_body_size 10m
La taille maximale de l'entité autorisée à être demandée par le client
chemin racine
Définissez le répertoire racine sur le système de fichiers où se trouve la ressource correspondant à la demande l'URL est située
location [ = | ~ | ~* | ^~ ] uri { ... }
设置一个 uri 匹配路径
=:精确匹配
~:正则表达式匹配,区分字符大小写
~*:正则表达式匹配,不区分字符大小写
^~:uri 的前半部分匹配,且不实用正则表达式
优先级:
= > location 完整路径 > ^~ > ~ > ~* > location 起始路径 > location /
allow 和 deny
基于 ip 访问控制,如:
仅允许 192.168.0.0/24 网段客户端访问
allow 192.168.0.0/24;
deny all;
stub_status on
开启状态显式,仅能用于 location 中:
开启状态显式页面
location /status { stub_status on; allow 172.16.0.0/16; deny all; }
rewrite
url 重写,可以使用多种标记
例如:
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
可用的 flag:
- last:重写完成后,继续匹配其他 rewrite 规则
- break:重写完成后不再继续匹配
- redirect:返回 302 重定向(临时重定向),客户端对重定向的 url 发起新的请求
- permanent:返回 301 重定向(永久重定向),客户端对重定向的 url 发起新的请求
一个 server 配置示例:
server { listen 80; server_name www.example.com; root /web/htdocs; location / { index index.html index.htm; } location /status { stub_status on; allow 10.0.0.0/8; deny all; access_log off; }
2.3 ssl 的配置
启用一个 ssl 虚拟主机
server { listen 443; server_name example.com; root /apps/www; index index.html index.htm; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; # ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2; # ssl_ciphers all:!adh:!export56:rc4+rsa:+high:+medium:+low:+sslv2:+exp; # ssl_prefer_server_ciphers on; }
其中 ssl_certificate 表示 ca 文件,ssl_certificate_key 表示密钥文件。
如果想把 http 请求强制转到 https,可以这样:
server { listen 80; server_name example.me; return 301 https://$server_name$request_uri; }
2.4 nginx 做负载均衡反向代理
nginx 做反向代理时,后端主机有多台,可以使用 upstream 定义一个后端主机池,在反向代理时直接使用主机池的名字。在 upstream 中可以定义负载均衡调度算法,权重,健康状态检测等参数。
例如:
upstream backend { server 172.16.0.1:80 weight=1 max-fails=3 fail_timeout=10; server 172.16.0.2:80 weight=1max-fails=3 fail_timeout=10;; }
默认请求下,使用 round-robin 调度算法,并有健康状态检查和恢复主机的能力。
ningx 还可以使用这些算法:
ip_hash:基于源地址哈希,主要目的是会话保持
least_conn:基于最少活动连接进行调度
sticky:基于 cookie 进行会话绑定,nginx 会在客户端第一次访问时插入路由信息到 cookie 中,或者选择 cookie 中的某个字段的值作为键,以后每次请求将基于此信息进行调度
基于 cookie 的会话绑定共有 cookie,route 和 learn 三种。
例如,基于 cookie name 的调度:
upstream backend { server backend1.example.com; server backend2.example.com; sticky cookie srv_id expires=1h domain=.example.com path=/; }
使用此主机组进行反向代理:
location / { proxy_pass http://backend; proxy_set_header host $host; proxy_set_haeder x-forwared-for $proxy_add_x_forwarded_for; }
proxy_pass url 指定代理的后端主机,可以指定 "http" 或 "https" 协议,域名可以是 ip 地址,也可以是 upstream 池名字
如果代理指定的是一个 uri 地址,如 http://127.0.0.1/remote,那么将直接被代理至指定 uri,无论请求的 uri 是什么
如果代理指定的一个主机而没有 uri,如 http://127.0.0.1,客户端请求的uri将被传递至指定域名
如果 location 中使用模式匹配 url,那么 url 也会被传递至代理 url 的末端
如果 location 中使用了 uri 重写,那么 proxy_pass 会使用重写后的结果进行处理
proxy_set_header header value 对转发的报文首部进行修改
2.5 反向代理时的缓存相关设定
proxy_cache_path path [levels=levels] keys_zone=name:size
定义磁盘缓存路径,nignx 的缓存是以键值方式存放的,keys_zone 用于指定键存放的内存空间名字和大小,对应的值则存放在 path 指定的路径中。levels 可以指定缓存存放路径的级数和名称字符数。此设置只能在 http 段中定义。
如:
proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=one:10m;
proxy_cache_valid [code ...] time 指定不同响应码的内容的缓存时间
如:
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid any 1m;
proxy_cache_method method 定义哪些方法的请求结果可以被缓存,如:
proxy_cache_method get; proxy_cache_method head;
proxy_cache name 指定使用预先定义的缓存空间用于缓存
2.6 fastcgi 代理的设置
使用 fastcgi 时,设置代理的方法同 porxy_pass 类似,同时还可以使用 fastcgi 缓存,设置的方法也和 proxy_cache 类似。
location ~ \.php$ { root /web/htdocs; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param script_filename $document_root$fastcgi_script_name; include fastcgi_params; }
3. 一些常用内置变量
$arg_name : nom du paramètre dans l'uri de la requête vers
$args : tous les paramètres de l'uri de la requête, identiques à $query_string
$uri : l'uri demandé actuel, sans paramètres
$request_uri : l'uri demandé, avec les paramètres complets
$ host : l'hôte en-tête dans le message de requête http. S'il n'y a pas d'en-tête d'hôte, il sera remplacé par le nom d'hôte de l'hôte virtuel qui gère la requête. $hostname : Le nom d'hôte de l'hôte sur lequel le service nginx est exécuté. client ip. $remote_port : Port client
$remote_user : Le nom d'utilisateur saisi par l'utilisateur client lors de l'utilisation de l'authentification utilisateur
$request_filename : Le chemin du fichier local mappé après l'uri dans la demande de l'utilisateur est converti par la racine locale ou l'alias
$request_method : Méthode de requête
$server_addr : Adresse du serveur
$server_name : Nom du serveur
$server_port : Port du serveur
$server_protocol : Le protocole lorsque le serveur envoie une réponse au client, tel que http/1.1, http/1.0
$scheme : Le schéma utilisé dans la requête, tel que https : https
$http_name dans //www.magedu.com/ : correspond à l'en-tête spécifié dans le message de requête, tel que $http_host correspond à l'en-tête de l'hôte dans le message de requête
$sent_http_name : correspond à l'en-tête spécifié dans le message de réponse, tel que $ sent_content_type correspond à l'en-tête de type de contenu dans le message de réponse
$status : état de la réponse
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!