В настоящее время широко используется nginx+php в качестве архитектурного режима веб-сервера. Тем не менее, первый шаг должен быть реализован, это как заставить nginx правильно вызывать php. Поскольку nginx вызывает php не так просто, как вызов статического файла, он требует динамического выполнения php-скриптов. Таким образом, это связано с настройкой файла nginx.conf. Этот шаг вообще необходим новичкам для поиска информации в сети.У рядовых специалистов есть много учеников, которые не понимают, зачем нужно так настраивать. Основное содержание этой статьи — как правильно настроить метод вызова php в сервере nginx, а также основные принципы настройки.
Во-первых, изменение файла конфигурации nginx
Расположение файла конфигурации
Расположение файла конфигурации Nginx по умолчанию:/etc/nginx/nginx.conf
в моем окруженииnginx.conf
существует/etc/nginx/nginx.conf
Откройте файл nginx.conf с помощью vim
vim /etc/nginx/nginx.conf
Анализ профиля
# nginx运行的用户名
user nginx;
# nginx启动进程,通常设置成和cpu的数量相等,这里为自动
worker_processes auto;
# errorlog文件位置
error_log /var/log/nginx/error.log;
# pid文件地址,记录了nginx的pid,方便进程管理
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
# 用来加载其他动态模块的配置
include /usr/share/nginx/modules/*.conf;
# 工作模式和连接数上限
events {
# 每个worker_processes的最大并发链接数
# 并发总数:worker_processes*worker_connections
worker_connections 1024;
}
# 与提供http服务相关的一些配置参数类似的还有mail
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记录访问的用户、页面、浏览器、ip和其他的访问信息
access_log /var/log/nginx/access.log main;
# 这部分下面会单独解释
# 设置nginx是否使用sendfile函数输出文件
sendfile on;
# 数据包最大时发包(使用Nagle算法)
tcp_nopush on;
# 立刻发送数据包(禁用Nagle算法)
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;
# http服务上支持若干虚拟主机。
# 每个虚拟主机一个对应的server配置项
# 配置项里面包含该虚拟主机相关的配置。
server {
# 端口
listen 80 default_server;
listen [::]:80 default_server;
# 访问的域名
server_name _;
# 默认网站根目录(www目录)
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
# 默认请求
location / {
}
# 错误页(404)
error_page 404 /404.html;
location = /40x.html {
}
# 错误页(50X)
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
Ключевые моменты
1. Касательно error_log можно задать тип лога (какой уровень информации записывать): отладка, информация, уведомление, предупреждение, ошибка, крит
2. О файле отправки
Общий процесс передачи по сети
жесткий диск >> буфер ядра >> буфер пользователя >> буфер сокета ядра >> стек протоколов
После использования sendfile
жесткий диск >> буфер ядра (быстрое копирование в буфер ядра) >> стек протоколов
Производительность передачи может быть значительно улучшена.
3. tcp_nopush и tcp_nodelay
tcp_nopush работает, только если включен sendfile,
После включения tcp_nopush программа не будет отправлять пакет данных сразу после его получения, а будет отправлять его в тот момент, когда пакет данных будет самым большим, что может уменьшить перегрузку сети. (Наглеизация)
Напротив, tcp_nodelay отправляет пакеты немедленно.
конфигурация php fastcgi
После анализа конфигурационного файла приступайте к настройке среды.
Т.к. настроен только сервер PHP и используется только один порт, менять нужно только серверную часть
Нажмите «i» в vim, чтобы войти в режим редактирования
server {
listen 80 default_server;
listen [::]:80 default_server;
# 这里改动了,也可以写你的域名
server_name 192.168.17.26;
# 默认网站根目录(www目录)
root /var/www/;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
# 这里改动了 定义首页索引文件的名称
index index.php index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
# 这里新加的
# PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI协议默认配置.
# Fastcgi服务器和程序(PHP,Python)沟通的协议.
location ~ \.php$ {
# 设置监听端口
fastcgi_pass 127.0.0.1:9000;
# 设置nginx的默认首页文件(上面已经设置过了,可以删除)
fastcgi_index index.php;
# 设置脚本文件请求的路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 引入fastcgi的配置文件
include fastcgi_params;
}
}
После завершения модификации переключите редактор vim в обычный половинный режим (Esc), а затем введите: wq для сохранения и выхода.
Затем перезапустите службу Nginx.
service nginx restart
Вышеупомянутая конфигурация успешна, но приведенная выше конфигурация является лишь частью конфигурации nginx, и необходимо изучить больше информации.
контрольная работа
Мы можем судить об успешной конфигурации Nginx с помощью следующих методов.
Создайте файл php в корневом каталоге веб-сайта Nginx (/var/www/) и назовите меня php_info.php.
Содержание следующее:
<?php
// 顺便可以看一下php的扩展全不全
phpinfo();
Перейдите на свой веб-сайт и посмотрите, сможете ли вы открыть файл. Ваш ip/имя файла Например: 192.168.17.26/php_info.php
хорошо, мы видим, что конфигурация прошла успешно.
Во-вторых, принцип работы nginx+php
Вышеупомянутое мы успешно настроили, теперь давайте рассмотрим конкретный принцип.
Во-первых, кратко о принципе, текущий основной принцип работы nginx + php выглядит следующим образом:
1. нгинксworker进程
Напрямую управляйте каждым сетевым запросом к nginx.
2. Для php, поскольку php — это роль cgi-программы во всем процессе сетевого запроса, имяphp-fpm的进程管理程序
Для управления этими запрошенными программами php. Программа php-fpm, как и nginx, должна прослушивать порт и иметь главный и рабочий процессы. Рабочий процесс напрямую управляет каждым процессом php.
3. О fastcgi: fastcgi — это менеджер процессов, управляющий процессами cgi. На рынке существует множество менеджеров процессов, реализующих функцию fastcgi, и php-fpm — один из них. Еще один момент, php-fpm, как служба управления процессами fast-cgi, будет прослушивать порт,一般默认监听9000端口,并且是监听本机
, то есть получать запросы портов только от этой машины, поэтому мы обычно вводим команду netstat -nlpt|grep php-fpm и получаем:
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
1057/php-fpm
127.0.0.1:9000 здесь означает прослушивание порта 9000 локальной машины.
4. Что касается файла конфигурации fastcgi, в настоящее время файл конфигурации fastcgi обычно размещается в том же каталоге, что и nginx.conf.Как правило, существует два типа файлов конфигурации: fastcgi.conf и fastcgi_params. Разные версии nginx будут иметь разные конфигурационные файлы, между двумя конфигурационными файлами есть очень важное различие: в файле fastcgi_parames отсутствует следующая конфигурация:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Мы можем открыть файл fastcgi_parames и добавить указанную выше строку или добавить ее динамически там, где мы хотим использовать конфигурацию. чтобы конфигурация вступила в силу.
5.当需要处理php请求时,nginx的worker进程会将请求移交给php-fpm的worker进程进行处理,也就是最开头所说的nginx调用了php,其实严格得讲是nginx间接调用php
.
После понимания пяти простых принципов становится легко настроить метод вызова php в nginx.
Детали файла конфигурации:
server {
listen 8011;
server_name test.cn;
location ~ \.php?.*$ {
root /share/test;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
1. Первый скобочный сервер{ }: Само собой разумеется, он представляет собой независимый сервер,
2. listen 8011: от имени сервера, прослушивающего порт 8011.
3. location ~ .php?.*${ }: представляет расположение, которое может соответствовать соответствующему uri, которое используется для сопоставления типа uri и настройки логики и конфигурации для соответствующего запроса uri. Местоположение здесь соответствует всем запросам uri с .php, например:http://192.168.244.128:8011/test.php/asdasd
http://192.168.244.128:8011/index.php и т. д.
4. root /share/test: запросите корневой каталог ресурса и укажите uri, который соответствует местоположению, чтобы перейти в папку /share/teset, чтобы найти ресурс с таким же именем.
5. fastcgi_pass 127.0.0.1:9000: начало этой строки находится в центре внимания этой статьи: эта строка кода означает, что запрос uri, входящий в местоположение, рассматривается как программа cgi, и запрос отправляется на порт 9000 и передается перейти к обработке php -fpm.
6. параметр fastcgi_param
SCRIPT_FILENAME $document_root$fastcgi_script_name; : Эта строка конфигурации означает: строка конфигурации fastcgi добавляется динамически, а содержимое конфигурации — SCRIPT_FILENAME, которое сообщает процессу управления имя сценария cgi. Поскольку в моем nginx есть только файл fastcgi_params и нет файла fastcgi.conf, эта строка конфигурации должна быть добавлена динамически, чтобы php-fpm знал конкретное значение SCRIPT_FILENAME.
7, включить fastcgi_params; ввести файл конфигурации fastcgi
Выше приведена простейшая конфигурация самой лаконичной версии nginx для запуска php-скрипта.После перезапуска nginx создайте файл xx.php в каталоге /share/test и введите Сохранить, а затем посетить localhost:8011/xx.php в браузере, чтобы отобразить hello world на веб-странице.
3. Доступ к внешней сети, настройки внутренней сети
Внешний IP:http://58.62.21.107:8382 Сопоставьте порт 82 IP-адреса 192.168.17.56 сервера интрасети, а именно: 192.168.17.56:82, который должен находиться вnginx.conf
В конфигурационном файле открываем порт 82 для доступа из внешней сети, то есть следующую конфигурацию:
[root@ceshi www]# cat /etc/nginx/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/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;
server {
listen 82 default_server; # 服务器端口,和外网映射的需保持一致
listen [::]:82 default_server; # 服务器端口,和外网映射的需保持一致
server_name 192.168.17.56;
root /data/www/;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
# PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI协议默认配置.
# Fastcgi服务器和程序(PHP,Python)沟通的协议.
location ~ \.php$ {
# 设置监听端口
fastcgi_pass 127.0.0.1:9000;
# 设置nginx的默认首页文件(上面已经设置过了,可以删除)
fastcgi_index index.php;
# 设置脚本文件请求的路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 引入fastcgi的配置文件
include fastcgi_params;
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
Справочная статья:
Установка и настройка Nginx (PHP)
Конфигурация и принцип работы nginx+php