centos7-lnmp环境配置-nginx-php-mysql

lnmp环境配置-nginx-php-mysql

  • 简介
  • 1. 环境准备
  • 2. 配置nginx
  • 3. 配置php-fpm
  • 4. 配置mysql
  • 5. 测试

简介

lnmp环境一般是中小型公司常用的一个环境,现在也有很多的lnmp一键安装脚本,宝塔面板等等工具,功能更加丰富,可以选择安装组件的版本。但是对于稍微大一些的公司一般情况下都不在用这种一键安装工具了,原因:太复杂,不排除有漏洞的可能性。所以能够自己掌握编译这些组件的方式,更加可控、安全、且方便后期升级变更,方便管理。而且后期部署量较大的情况下,可以参考开源的lnmp脚本,自己修改、自定义,更加方便、可控。

1. 环境准备

主机环境是centos7.9,先安装一些常用的软件包

yum -y install epel-release
yum -y install vim-enhanced telnet bind-utils perl-libwww-perl perl-LWP-Protocol-https openssl-devel pcre-devel yum-utils wget curl gcc glibc make cmake autoconf pcre pcre-devel lrzsz net-tools unzip zip bash-completion

2. 配置nginx

nginx下载地址:http://nginx.org/en/download.html

wget http://nginx.org/download/nginx-1.20.2.tar.gz
tar -xcvf nginx-1.20.2.tar.gz
cd nginx-1.20.2

# 编译安装
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-debug \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module

make && make install

mkdir /var/log/nginx
useradd www -s /sbin/nologin -M  #不创建家目录,不能登录
chown -R www.www /usr/local/nginx/

注意:如果编译安装过程中出现错误,屏幕上会出现报错信息。大部分的编译报错是由于缺少某些库的支持引起的。
另外,在没有改动源代码的情况下,如果需要重新编译安装nginx,就不必再使用configure脚本自动生成makefile了,可以删除上次安装的nginx路径,解压源码包重新按上面的编译安装步骤来一遍。


修改/etc/profile文件,把nginx目录加入到系统路径

# vim /etc/profile
export NGINX_HOME=/usr/local/nginx/
export PATH=$NGINX_HOME/sbin/:$PATH
# 使配置生效
source /etc/profile
nginx -V  # 确认配置没有问题

添加nginx服务,方便管理

cat > /etc/systemd/system/nginx.service <<EOF
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking

LimitCORE=infinity
LimitNOFILE=1000000
LimitNPROC=1000000

PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

EOF

systemctl start nginx
systemctl enable nginx

主配置文件nginx.conf参考

user  www www;
worker_processes  auto;
pid /run/nginx.pid;

worker_rlimit_nofile 100000;

events
{
    use epoll;
    worker_connections 100000;
}

http
{
    server_tokens off;
    include       mime.types;
    default_type  application/octet-stream;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    
    #proxy_ssl_server_name on;

    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 3m;

    sendfile on;
    tcp_nopush     on;

    keepalive_timeout  60;
    tcp_nodelay on;

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/javascript text/css application/xml;
    gzip_vary on;

    proxy_buffer_size 128k;
    proxy_buffers   32 128k;
    proxy_busy_buffers_size 128k;
    proxy_ignore_client_abort on;

    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" "$http_host" '
                        '$status $body_bytes_sent "$http_referer" "$host" '
                        '"$http_user_agent" $http_x_forwarded_for '
                        '$connection $upstream_addr "$upstream_http_host" '
                        'upstream_response_time $upstream_response_time request_time $request_time ' $scheme;

    access_log  /var/log/nginx/access.log  access;
    error_log   /var/log/nginx/error.log;

    server{
        listen       80;
        server_name localhost;
        
        index index.html index.htm;
        root  /usr/local/nginx/html/;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

    }

include       vhosts/*.conf;
}

新建一个vhosts目录,以后新增的域名配置文件都放在这个目录里面

mkdir -pv /usr/local/nginx/conf/vhosts/
chown -R www.www /usr/local/nginx/
systemctl restart nginx

nginx基本配置完成。

3. 配置php-fpm

源码包下载地址:https://www.php.net/releases/


yum -y install freetype freetype-devel libpng libpng-devel libxml2 \
 libxml2-devel bzip2 bzip2-devel mhash mhash-develbzip2-devel libmcrypt \ 
 libmcrypt-devel libzip libezip-devel psmisc.x86_64 recode recode-devel \ 
 libtidy libtidy-devel libevent libevent-devel openssl libssl-dev \ 
 libcurl4-gnutls-dev libjpeg-dev libpng-dev libmcrypt-dev libreadline6 \ 
 libreadline6-dev autoconf curl-devel

wget https://www.php.net/distributions/php-7.3.13.tar.gz
tar -xvf php-7.3.13.tar.gz
cd php-7.3.13

# 编译安装
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-inline-optimization \
--enable-shared \
--enable-calendar \
--with-openssl \
--enable-opcache \
--enable-fpm \
--with-mysqli \
--with-pdo-mysql \
--with-gettext \
--enable-mbstring \
--with-iconv \
--with-mhash \
--enable-mbregex \
--enable-bcmath \
--enable-soap \
--with-libxml-dir \
--enable-pcntl \
--enable-shmop \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-sockets \
--enable-session \
--enable-xml \
--with-curl \
--with-zlib \
--enable-zip \
--with-bz2 \
--with-gd \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-pcre-regex \
--with-pdo-sqlite \
--without-pear \
--with-png-dir \
--with-xmlrpc \
--with-zlib

# 如果编译报错,可能是有些扩展包没有安装,根据错误提示添加安装包就行,然后重新编译
# 例如libzip的扩展
yum remove libzip libzip-devel 
wget https://libzip.org/download/libzip-1.3.2.tar.gz
tar xvf libzip-1.3.2.tar.gz
cd libzip-1.3.2
./configure
make && make install

# 注意,默认编译成功后是nts版本的,如果要编译zts版本的,添加如下编译参数
--enable-maintainer-zts


# make -j $(($(nproc)-1)) 适用于多核CPU的情况
make
make install

编译安装完成后,修改/etc/profile文件,把php目录加入到系统路径

# vim /etc/profile
export PHP_HOME=/usr/local/php/
export PATH=$PHP_HOME/sbin/:$NGINX_HOME/sbin/:$PATH

添加配置文件

# php --ini 
Configuration File (php.ini) Path: /usr/local/php/etc
Loaded Configuration File:         (none)
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

# 新编译好的php是没有主配置文件php.ini的,到解压包目录下可以看到有两个示例文件:
php.ini-development  
php.ini-production

cp php.ini-production /usr/local/php/etc/php.ini
然后再根据需要调整修改这个配置文件即可。
# 修改php.ini中的时区设置
# vim /usr/local/php/etc/php.ini
date.timezone = Asia/Shanghai

cd /usr/local/php/etc/
cp php-fpm.conf.default php-fpm.conf
cd php-fpm.d/
cp www.conf.default www.conf

# 修改www.conf配置文件,主要是下面的配置,php-fpm监听可以用socket和端口两种方式
# 也可以不修改,直接用默认的,默认的也是端口监听的方式

[www]
user = www
group = www

# listen = /tmp/php-fpm.socket
listen = 127.0.0.1:9000

listen.backlog = 8192
listen.owner = www
listen.group = www
listen.mode = 0666

pm = dynamic
pm.max_children = 50
pm.start_servers = 8
pm.min_spare_servers = 5 
pm.max_spare_servers = 20

配置php-fpm服务

cp sapi/fpm/php-fpm.service /etc/systemd/system/php-fpm.service
systemctl start php-fpm
systemctl enable php-fpm

ps -ef|grep php
netstat -tnulp|grep php

如果服务启动无异常,说明配置成功。


安装php扩展组件,比如redis,mongo
各种扩展包地址:http://pecl.php.net/package-stats.php

安装redis扩展包
下载地址:http://pecl.php.net/package/redis
选择一个最新版本的安装包下载编译,不同版本的安装包可能与你要安装的php版本不匹配,这时可以降低版本安装

wget http://pecl.php.net/get/redis-5.3.0.tgz
tar -xvf redis-5.3.0.tgz
cd redis-5.3.0/
/usr/local/php/bin/phpize 
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install 

# 修改php.ini文件,把扩展加进来,加一行如下配置
extension=redis.so

加完之后,测试一下
php -m | grep redis
如果能看到显示,就说明扩展安装成功了

安装mongo扩展包,类似redis的,如下

wget http://pecl.php.net/get/mongodb-1.9.2.tgz
tar -xvf mongodb-1.9.2.tgz
cd mongodb-1.9.2/
/usr/local/php/bin/phpize 
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install 

# 修改php.ini文件,把扩展加进来,加一行如下配置
extension=redis.so

加完之后,测试一下
php -m|grep mongodb
如果能看到显示,就说明扩展安装成功了

4. 配置mysql

mysql不用编译安装的方式,直接下载oracle官方的rpm包,用yum安装的方式。
或者用mysql二进制包的方式,不太推荐用编译安装的方式。
测试的时候也可以用docker配置的方式,更加简单。

下面用rpm安装的方式安装配置mysql。
下载地址:https://downloads.mysql.com/archives/community/

下载这个安装包合集
centos7-lnmp环境配置-nginx-php-mysql_第1张图片

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.36-1.el7.x86_64.rpm-bundle.tar
tar -xvf mysql-5.7.36-1.el7.x86_64.rpm-bundle.tar
# 直接全部安装完事,当然也可以按照需要安装
yum remove mariadb*
yum -y localinstall mysql-community-*.rpm

centos7-lnmp环境配置-nginx-php-mysql_第2张图片
查看初始密码:

grep 'password' /var/log/mysqld.log |less

进行初始化设置:

# 进入MySQL命令行
mysql -uroot -p
# 
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root@2022';
Query OK, 0 rows affected (0.00 sec)

# 新建数据库,新建用户
mysql> create database mydata;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on mydata.* to 'test'@'127.0.0.1' identified by 'Test@2022';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;

mysql的配置文件位置在/etc/my.cnf,参考配置如下:

[mysqld]

innodb_buffer_pool_size = 1024M
innodb_flush_log_at_trx_commit=1

log_bin=mysql-bin
expire_logs_days=15

binlog_format=mixed
slow_query_log=1
slow_query_log_file=mysql-slow.log


datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

port = 3306
server_id = 1011
user=mysql

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

max_connections=301
character_set_server=utf8mb4

validate_password_policy=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

设置服务开机启动

systemctl enable nginx php-fpm mysqld

5. 测试

测试php
修改nginx.conf配置,设置默认配置

    server {
        listen       80;
        server_name  localhost;
        index index.php index.htm index.html;
        root /usr/local/nginx/html/;

        location / {
            try_files $uri $uri/ /index.php?$args;
        }

        location ~ .*\.(php|php5)?$ {
            include fastcgi.conf;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

新建测试文件index.php

# vim /usr/local/nginx/html/index.php
<html>
<h1>This is a php test page.</h1>
<?php
phpinfo();
?>
</html>
~           

nginx配置重新加载

nginx -t
nginx -s reload

访问服务器的80端口,可以看到如下页面:
centos7-lnmp环境配置-nginx-php-mysql_第3张图片
说明nginx+php-fpm的设置没有问题了。

OK,现在nginx,php,mysql已经全部配置完毕。

你可能感兴趣的:(linux,运维,nginx,mysql,php,linux,服务器)