Linux – CentOS 7 下安装 LNMP 环境
     发布在:System      浏览:69      评论:0 条评论

请先安装 Linux 常用依赖包:《Linux 常用 Yum 依赖包》

MySQL Yum 安装

官方文档:https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/

下载并安装 MySQL 官方的 Yum Repository

> rpm -Uvh http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
Linux - CentOS 7 下安装 LNMP 环境

安装 MySQL

> yum -y install mysql-community-server
Linux - CentOS 7 下安装 LNMP 环境

启动 MySQL

> service mysqld start
# 若提示 Redirecting to /bin/systemctl start mysqld.service,则使用下面这个
> systemctl start mysqld.service

查看 MySQL 运行状态

> service mysqld status
# or
> systemctl status mysqld.service
Linux - CentOS 7 下安装 LNMP 环境

设置开机启动

> systemctl enable mysqld.service

查看初始密码

> grep 'temporary password' /var/log/mysqld.log
# 如下图,初始密码为5Eatk=Q7iCPe
Linux - CentOS 7 下安装 LNMP 环境

进入数据库

> mysql -uroot -p
# 会弹出 Enter password 要求输入密码
Linux - CentOS 7 下安装 LNMP 环境

此时必须修改初始密码才能操作数据库

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';

【要求】密码至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符,并且总密码长度至少为8个字符

Linux - CentOS 7 下安装 LNMP 环境

MySQL 更新与不更新

> yum -y update mysql-server
# or
> yum -y update
# 若在执行 Yum 时,不想更新 MySQL,可以卸载 Repository
> rpm -e --nodeps mysql80-community-release-el7-1.noarch

可视化 MySQL 管理软件登录授权

> grant all on *.* to root@'%' identified by '数据库密码';

Nginx Yum 安装

下载并安装 Nginx 官方的 Yum Repository

> rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
Linux - CentOS 7 下安装 LNMP 环境

安装 Nginx

> yum -y install nginx
Linux - CentOS 7 下安装 LNMP 环境

启动 Nginx

> systemctl start nginx.service

开启 80 端口,并通过域名或IP访问站点

> firewall-cmd --zone=public --add-port=80/tcp --permanent # 开启 80 端口
> firewall-cmd --reload # 重启防火墙
Linux - CentOS 7 下安装 LNMP 环境

设置开机启动

> systemctl enable nginx.service

Nginx 配置信息

说明 路径
网站文件存放默认目录 /usr/share/nginx/html
网站默认站点配置 /etc/nginx/conf.d/default.conf
自定义Nginx站点配置文件存放目录 /etc/nginx/conf.d/
Nginx全局配置 /etc/nginx/nginx.conf
Nginx启动 nginx -c /etc/nginx/nginx.conf

PHP Yum 安装

下载并安装 Yum Repository

> yum -y install epel-release
> rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

安装 PHP7.2

> yum -y install mod_php72w php72w-opcache php72w-cli php72w-fpm php72w-common php72w-devel php72w-mysql php72w-pear
安装包 提供的扩展
mod_php72w php72w, mod_php, php72w-zts
php72w-bcmath
php72w-cli php-cgi, php-pcntl, php-readline
php72w-common php-api, php-bz2, php-calendar, php-ctype, php-curl, php-date, php-exif,
php-fileinfo, php-filter, php-ftp, php-gettext, php-gmp, php-hash, php-iconv,
php-json, php-libxml, php-openssl, php-pcre, php-pecl-Fileinfo, php-pecl-phar,
php-pecl-zip, php-reflection, php-session, php-shmop, php-simplexml,
php-sockets, php-spl, php-tokenizer, php-zend-abi, php-zip, php-zlib
php72w-dba
php72w-devel
php72w-embedded php-embedded-devel
php72w-enchant
php72w-fpm
php72w-gd
php72w-imap
php72w-interbase php_database, php-firebird
php72w-intl
php72w-ldap
php72w-mbstring
php72w-mysql php-mysqli, php_database
php72w-mysqlnd php-mysqli, php_database
php72w-odbc php-pdo_odbc, php_database
php72w-opcache php72w-pecl-zendopcache
php72w-pdo php72w-pdo_sqlite, php72w-sqlite3
php72w-pdo_dblib php72w-mssql
php72w-pear
php72w-pecl-apcu
php72w-pecl-imagick
php72w-pecl-mongodb
php72w-pgsql php-pdo_pgsql, php_database
php72w-phpdbg
php72w-process php-posix, php-sysvmsg, php-sysvsem, php-sysvshm
php72w-pspell
php72w-recode
php72w-snmp
php72w-soap
php72w-sodium
php72w-tidy
php72w-xml php-dom, php-domxml, php-wddx, php-xsl
php72w-xmlrpc

查看一下 PHP 版本,以及扩展

> php -v
> php -m
Linux - CentOS 7 下安装 LNMP 环境

PHP + Nginx 配置

配置 PHP-FPM

> vim /etc/php-fpm.d/www.conf
# ---------------------------
user = nginx
group = nginx

启动 PHP-FPM

> /usr/sbin/php-fpm

添加 PHP-FPM 至系统服务,并设置开机启动

《Linux CentOS 7 下添加 PHP-FPM 至系统服务》

检查 PHP-FPM 服务

> ps -ef | grep php-fpm
> netstat -tlnp | grep 9000
Linux - CentOS 7 下安装 LNMP 环境

修改 Nginx 配置

> cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.backup # 备份初始配置
> vim /etc/nginx/conf.d/default.conf
# ----------------------------------
# 去掉注释,修改 root 和 fastcgi_param
location ~ \.php$ {
    root           /usr/share/nginx/html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

Nginx 重载配置

> nginx -s reload

编写一个测试的 PHP 程序

> vim /usr/share/nginx/html/index.php
# -----------------------------------
<?php
    phpinfo();
?>

浏览器输入地址查看

Linux - CentOS 7 下安装 LNMP 环境

设置 Session 目录访问权限

> cd /var/lib/php
> chown -R nginx:nginx *

PHP-FPM 启动、停止、重启

> systemctl start php-fpm   # 启动
> systemctl stop php-fpm    # 停止
> systemctl restart php-fpm # 重启

PHP-FPM 配置文件路径:/etc/php-fpm.conf and /etc/php-fpm.d/*.conf

Nginx 编译安装及优化

利用 TCMalloc 优化 Nginx 的性能

【注】这里的 Nginx 是以编译方式安装,而非 Yum 安装

Nginx 编译包下载地址:http://nginx.org/download/nginx-1.14.2.tar.gz

libunwind 下载地址:https://download-mirror.savannah.gnu.org/releases/libunwind/

gperftools 下载地址:https://github.com/gperftools/gperftools/releases/

# 安装 libunwind
> cd /opt
> wget https://download-mirror.savannah.gnu.org/releases/libunwind/libunwind-1.2.1.tar.gz
> tar -zxvf libunwind-1.2.1.tar.gz
> cd libunwind-1.2.1
> ./configure && make && make install

# 安装 google-perftools
> cd /opt
> wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.7/gperftools-2.7.tar.gz
> tar -zxvf gperftools-2.7.tar.gz
> cd gperftools-2.7
> ./configure --enable-frame-pointers && make && make install

# 配置 gperftools
> echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
> /sbin/ldconfig

# 之后编译安装 Nginx
> cd /opt
> wget http://nginx.org/download/nginx-1.14.2.tar.gz
> tar -zxvf nginx-1.14.2.tar.gz
> cd nginx-1.14.2
> ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-google_perftools_module
> make && make install

# 创建线程目录
> mkdir /tmp/tcmalloc
> chmod 777 /tmp/tcmalloc

# 修改 Nginx 配置文件
> vim /usr/local/nginx/conf/nginx.conf
# ------------------------------------
# pid logs/nginx.pid;
google_perftools_profiles /tmp/tcmalloc;
# ------------------------------------

# 如何添加 nginx 到系统服务,可以看这份文档
# https://www.oceanickang.com/skill/Linux_2382_2018_12_11.html

# 添加 www 用户和组,如果已添加可跳过
> groupadd www
> useradd -g www -s /sbin/nologin www

# 开启 80 端口
> firewall-cmd --zone=public --add-port=80/tcp --permanent

# 重启防火墙
> firewall-cmd --reload

# 重启 Nginx
> systemctl restart nginx

# 测试
> lsof -n | grep tcmalloc
> lsof -n | grep nginx

Nginx 内核优化

常见优化参数如下:

net.ipv4.tcp_max_tw_buckets = 6000        # 设定 timewait 数量,默认180000
net.ipv4.ip_local_port_range = 1024 65000 # 设定允许系统打开的端口范围
net.ipv4.tcp_tw_recycle = 1               # 设置启用 timewait 快速回收
net.ipv4.tcp_tw_reuse = 1                 # 设置开启重用,允许将 timewait sockets 重新用于新的 TCP 连接
net.ipv4.tcp_syncookies = 1               # 设置开启 SYN Cookies,当出现 SYN 等待队列溢出时,启用 cookies 进行处理
net.core.somaxconn = 262144               # 用于调节系统同时发起 TCP 连接数,默认128。需要结合并发请求数来调节此值
net.core.netdev_max_backlog = 262144      # 当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目      
net.ipv4.tcp_max_orphans = 262144         # 设定系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并打印出警告信息。这个限制只是为了防止简单的 DOS 攻击。不能过分依靠这个限制,甚至减小这个值,更多的情况是增加这个值
net.ipv4.tcp_max_syn_backlog = 262144     # 记录那些尚未收到客户端确认信息的连接请求的最大值。对于有 128MB 内存的系统而言,此参数的默认值是 1024,对于小内存的系统则是 128
net.ipv4.tcp_synack_retries = 1           # 参数的值决定了内核放弃连接之前发送 SYN+ACK 包的数量
net.ipv4.tcp_syn_retries = 1              # 在内核放弃建立连接之前发送 SYN 包的数量
net.ipv4.tcp_fin_timeout = 1              # 套接字保持在 FIN-WAIT-2 状态的时间。默认值是 60 秒。正确设置这个值非常重要,有时候即使一个负载很小的 WEB 服务器,也会出现因为大量的死套接字而产生内存溢出的风险
net.ipv4.tcp_keepalive_time = 30          # 当 keepalive 启用的时候,TCP 发送 keepalive 消息的频度。默认值是 2(小时)

将上面的内核参数值加入 /etc/sysctl.conf 文件中,然后执行如下命令使之生效:

> /sbin/sysctl -p

配置文件优化

配置 参数 说明
worker_processes 8 Nginx 进程数,建议按照 CPU 数目来指定,
一般为它的倍数(如 2 个四核 CPU 计为 8)
worker_cpu_affinity 00000001 00000010
00000100 00001000
00010000 00100000
01000000 10000000
为每个进程分配 CPU,
上例中将 8 个进程分配到 8 个 CPU,也可以写多个,
或者将一个进程分配到多个 CPU
worker_rlimit_nofile 65535 当一个 Nginx 进程打开的最多文件描述符数目,
理论值应该是最多打开文件数(ulimit -n)与 Nginx 进程数相除,
但是 Nginx 分配请求并不是那么均匀,
所以最好与 ulimit -n 的值保持一致
use epoll 使用 epoll 的 I/O 模型
worker_connections 65535 每个进程允许的最多连接数,理论上每台 Nginx 服务器的
最大连接数为 worker_processes * worker_connections
keepalive_timeout 60 keepalive 超时时间
client_header_buffer_size 4k 客户端请求头的缓冲区大小,
可以根据系统分页大小来设置,一般一个请求头的大小不会超过4k
open_file_cache max=65535
inactive=60s
将打开文件指定缓存,默认没有启用。
max指定缓存数量,建议和打开文件数一致,
inactive 指经过多长时间没被请求后删除缓存
open_file_cache_valid 80s 指多长时间检查一次缓存的有效信息
open_file_cache_min_uses 1 open_file_cache 指令中的 inactive 参数时间内文件的最少使用次数,
如果超过这个数字,文件描述符一直是在缓存中打开的
Responses