目錄javascript
做爲一名PHP開發者,咱們必定要懂得如何搭建PHP開發環境,目前主流的PHP開發環境組合是LAMP和LNMP,本文將介紹如何在CentOS7.*上搭建LNMP開發環境。php
各項版本說明:css
CentOS7: 7.7html
Nginx: 1.16.1java
MySQL:5.7.28node
PHP:7.2.25mysql
安裝所需全部的資源我都放在了/usr/local/src目錄下linux
wget
是一個從網絡上自動下載文件的自由工具,支持經過 HTTP、HTTPS、FTP 三個最多見的TCP/IP協議下載,並能夠可使用HTTP代理。nginx
sudo yum -y install wget
最小化安裝CentOS7時若是沒法使用ifconfig命令,則須要安裝net-tools
,若是是安裝的CentOS6版本則無需安裝c++
sudo yum -y install net-tools
sudo yum -y install vim
vim ~/.vimrc # 編輯.vimrc配置文件 set nu # 輸入set nu 後退出保存
systemctl stop firewalld.service #令關閉防火牆 systemctl disable firewalld.service #關閉防火牆開機自啓動 經過瀏覽器輸入IP測試是否成功
(1) 安裝 nginx
須要先將官網下載的源碼進行編譯,編譯依賴 gcc 環境,若是沒有 gcc 環境,則須要安裝gcc-c++。
yum -y install gcc gcc-c++
(2) PCRE
是一個Perl庫,中文"Perl兼容的正則表達式庫"。安裝Nginx是爲了使Nginx支持具有URI重寫功能的rewrite模塊,若是不安裝pcre庫,則Nginx沒法使用rewrite模塊功能,Nginx的Rewrite模塊功能幾乎是企業應用必須。
yum -y install pcre pcre-devel
(3) zlib
庫提供了不少種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內容進行 gzip ,因此須要在 Centos 上安裝 zlib 庫。
yum -y install zlib zlib-devel
(4) OpenSSL
是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、經常使用的密鑰和證書封裝管理功能及 SSL 協議,並提供豐富的應用程序供測試或其它目的使用。 nginx 不只支持 http 協議,還支持 https(即在ssl協議上傳輸http),因此須要安裝 OpenSSL 庫 。
yum -y install openssl openssl-devel
說明: yum安裝方式安裝的pcre版本比較低,不過基本不影響使用,可是最好仍是手動編譯安裝官網最新穩定版的openssl。
檢查基礎依賴包
上面的依賴安裝完成後能夠經過以下命令檢查各個依賴安裝是否成功
rpm -qa pcre pcre-devel rpm -qa zlib zlib-devel rpm -qa pcre pcre-devel
# 這裏咱們把安裝包都放到了/usr/local/src目錄下,便於統一管理 cd /usr/local/src #切換到軟件包目錄 wget http://nginx.org/download/nginx-1.16.1.tar.gz #下載nginx源碼包 useradd nginx -s /sbin/nologin -M #建立nginx用戶用於管理nginx程序 tar -zxvf nginx-1.16.1.tar.gz #解壓nginx源碼包 cd nginx-1.16.1 #預編譯 ./configure \ --user=nginx \ --group=nginx \ --prefix=/usr/local/nginx-1.16.1 \ --with-http_v2_module \ --with-http_ssl_module \ --with-http_stub_status_module make && make install #編譯 和 安裝 cd /usr/local ln -s nginx-1.16.1 nginx #建立nginx的軟連接
安裝說明
--prefix=PATH #設置安裝路勁 --user=USER #進程用戶權限 --group=GROUP #進程用戶組權限 --with-http_v2_module # HTTP2 --with-http_stub_status_module #激活狀態信息 --with-http_ssl_module #激活ssl功能
vim /etc/profile export PATH=/usr/local/nginx/sbin:$PATH source /etc/profile
新建並編輯/usr/lib/systemd/system/nginx.service
文件
vim /usr/lib/systemd/system/nginx.service
並添加以下內容(這裏的配置是根據本身安裝Nginx的路徑來配置的,Nginx安裝在了/usr/local
目錄下)
[Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop PrivateTmp=true [Install] WantedBy=multi-user.target
經過yum安裝的nginx,默認的nginx.service配置以下,能夠做爲參考
# /usr/lib/systemd/system/nginx.service [Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid # Nginx will fail to start if /run/nginx.pid already exists but has the wrong # SELinux context. This might happen when running `nginx -t` from the cmdline. # https://bugzilla.redhat.com/show_bug.cgi?id=1268621 ExecStartPre=/usr/bin/rm -f /run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=process PrivateTmp=true [Install] WantedBy=multi-user.target
重載daemon
執行下面的命令從新載入 systemd,掃描新的或有變更的單元便可
systemctl daemon-reload
設置開機自啓
systemctl enable nginx.service # 設置開機自啓 systemctl disable nginx.service # 取消開機自啓服務
Nginx服務管理經常使用命令
systemctl status nginx.service # 查看Nginx狀態 systemctl start nginx.service # 開啓Nginx systemctl stop nginx.service # 關閉Nginx systemctl reload nginx.service # 重載配置 systemctl restart nginx.service # 重啓Nginx(至關於stop&start)
服務啓動檢查
能夠經過該命令查詢80端口被誰佔用
lsof -i :80
若是沒法識別該命令,須要安裝lsof
sudo yum -y install lsof
(1)cmake是新版MySQL的編譯工具,必須安裝
sudo yum -y install gcc gcc-c++ cmake ncurses-devel perl perl-devel autoconf bison bison-devel libtirpc libtirpc-devel
若是安裝的MySQL5.7及以上的版本,在編譯安裝以前須要安裝boost,由於高版本mysql須要boots庫的安裝才能夠正常運行。不然會報CMake Error at cmake/boost.cmake:81
錯誤
切換到/usr/local/src
目錄,而後在這個目錄下下載boost
MySQL5.7.27要求boost的版本是1.59,更高版本的不適用MySQL5.7.28
wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
百度網盤連接: boost_1_59_0.tar.gz
# 添加MySQL用戶 useradd -s /sbin/nologin -M mysql # 切換到/usr/src目錄 cd /usr/local/src # 下載MySQL wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28.tar.gz # 解壓MySQL tar -zxvf mysql-5.7.28.tar.gz #解壓boost,並移至mysql/boost tar -zxvf boost_1_59_0.tar.gz mv boost_1_59_0 mysql-5.7.28/boost # 進到MySQL目錄 cd mysql-5.7.28 # 預編譯 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.28 \ -DWITH_BOOST=boost \ -DWITH_SYSTEMD=1 \ -DWITH_SSL=system \ -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \ -DMYSQL_DATADIR=/var/lib/mysql/data \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_INNODB_MEMCACHED=1 \ -DWITH_DEBUG=OFF \ -DWITH_ZLIB=bundled \ -DENABLED_LOCAL_INFILE=1 \ -DENABLED_PROFILING=ON \ -DMYSQL_MAINTAINER_MODE=OFF \ -DMYSQL_TCP_PORT=3306 # 編譯&安裝 make && make install # 建立軟連接 cd /usr/local ln -s mysql-5.7.28 mysql
# 添加到環境變量 vim /etc/profile export PATH=/usr/local/mysql/bin:$PATH source /etc/profile
在/var/lib
目錄下建立一個mysql
文件夾
mkdir -p /var/lib/{mysql,mysql/data} touch /var/lib/mysql/mysqld.pid chown mysql.mysql -R /var/lib/mysql/
修改/etc/my.cnf
文件
# 修改/etc/my.cnf文件,編輯配置文件以下 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci datadir=/var/lib/mysql/data socket=/var/lib/mysql/mysql.sock [mysqld_safe] log-error=/var/log/mysql/mysqld.log pid-file=/var/lib/mysql/mysqld.pid [client] default-character-set=utf8mb4
建立mysqld.log
和 mysqld.pid
文件,並修改文件權限
# 建立mysqld.log 和 mysqld.pid文件 mkdir /var/log/mysql touch /var/log/mysql/mysqld.log chown mysql.mysql -R /var/log/mysql/
初始化數據庫
# 初始化數據庫, –initialize 表示默認生成一個安全的密碼,–initialize-insecure 表示不生成密碼 mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql/data
建立一個/usr/lib/systemd/system/mysqld.service
文件,而後編輯內容以下
vim /usr/lib/systemd/system/mysqld.service
[Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql Type=forking PIDFile=/var/lib/mysql/mysqld.pid # Disable service start and stop timeout logic of systemd for mysqld service. TimeoutSec=0 # Execute pre and post scripts as root PermissionsStartOnly=true # Needed to create system tables ExecStartPre=/usr/local/mysql/bin/mysqld_pre_systemd # Start main service ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/lib/mysql/mysqld.pid $MYSQLD_OPTS # Use this to switch malloc implementation EnvironmentFile=/etc/my.cnf # Sets open_files_limit LimitNOFILE = 5000 Restart=on-failure RestartPreventExitStatus=1 PrivateTmp=true
重載daemon
執行下面的命令從新載入 systemd,掃描新的或有變更的單元便可
systemctl daemon-reload
啓動MySQL
systemctl start mysqld.service # 啓動MySQL systemctl stop mysqld.service # 關閉MySQL systemctl status mysqld.service # 查看MySQL狀態
開機自啓
systemctl enable mysqld.service # 設置開機自啓 systemctl disable mysqld.service # 取消開機自啓
mysql -u root -p #第一次登錄不須要密碼,回車便可 set password for root@localhost = password('root'); #修改密碼
sudo yum -y install gcc gcc-c++ zip unzip libxml2 libxml2-devel curl-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel gd-devel bzip2 bzip2-devel libzip libzip-devel libwebp libwebp-devel
cd /usr/local/src tar -zxvf php-7.2.25.tar.gz cd php-7.2.25 ./configure \ --prefix=/usr/local/php-7.2.25 \ --enable-fpm \ --with-fpm-user=nginx \ --with-fpm-group=nginx \ --enable-mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-mysql-sock=/var/lib/mysql/mysql.sock \ --with-gd \ --with-webp-dir \ --with-png-dir \ --with-gettext \ --with-jpeg-dir \ --with-freetype-dir \ --with-iconv-dir \ --with-zlib-dir \ --with-bz2 \ --with-openssl \ --with-curl \ --enable-mbstring \ --enable-static \ --enable-zip \ --enable-bcmath \ --enable-ftp \ --enable-pcntl \ --enable-soap \ --enable-calendar \ --enable-sockets \ --enable-exif \ --enable-xml make && make install
編譯參數詳解
./configure \ --prefix=/usr/local/php-7.2.25 \ # 指定安裝路徑 --enable-fpm \ # 表示激活PHP-FPM方式服務,即FactCGI方式運行PHP服務。 --with-fpm-user=nginx \ # 指定PHP-FPM進程管理的用戶爲nginx,此處最好和Nginx服務用戶統一。 --with-fpm-group=nginx \ # 指定PHP-FPM進程管理用戶組爲nginx,此處最好和Nginx服務用戶組統一。 --enable-mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-mysql-sock=/var/lib/mysql/mysql.sock \ --with-gd \ # 打開gd庫的支持 --with-webp-dir \ --with-png-dir \ --with-gettext \ # 實現了NLS (Native Language Support) API,他能夠用來國際化您的PHP程序 --with-jpeg-dir \ --with-freetype-dir \ --with-iconv-dir \ # 包含了 iconv 字符集轉換功能的接口。 --with-zlib-dir \ # 打開zlib庫的支持,用於http壓縮傳輸 --with-bz2 \ # 用於透明地讀寫 bzip2(.bz2)壓縮文件。 --with-openssl \ # 打開openssl,加密傳輸時用到 --with-curl \ # 打開curl瀏覽工具的支持 --enable-mbstring \ # 多字節,字符串的支持 --enable-static \ # 生成靜態連接庫 --enable-zip \ # 打開對zip的支持 --enable-bcmath \ --enable-ftp \ # 經過文件傳輸協議 (FTP) 提供對文件服務器的客戶端訪問 --enable-pcntl \ # 多進程 --enable-soap \ --enable-calendar \ --enable-sockets \ # 打開 sockets 支持 --enable-exif \ # 可交換圖像信息 --enable-xml
配置
cd /usr/local ln -s php-7.2.25 php cp /usr/local/src/php-7.2.25/php.ini-development /usr/local/php-7.2.25/lib/php.ini vim /usr/local/php/lib/php.ini date.timezone = PRC (大約在934行) expose_php = Off #避免PHP信息暴露在http頭中(大約369行) display_errors = Off(生產環境設置爲off,開發環境就設置爲On,便於調試) 說明:設置了dispaly_errors爲off後,須要在php-fpm.conf中開啓錯誤日誌記錄路徑error_log = log/php-fpm.log cd /usr/local/php cp etc/php-fpm.conf.default etc/php-fpm.conf cd /usr/local/php/etc/php-fpm.d/ cp www.conf.default www.conf cd /usr/local/php sbin/php-fpm ps -e | grep php-fpm 若是在編譯PHP時指定了--with-mysql=mysqlnd和--with-pdo-mysql=mysqlnd的參數,那麼在生產中可能會遇到socket鏈接問題,解決辦法是在php.ini里加入命令: pdo_mysql.default_socket=/var/lib/mysql/mysql.sock 最好是在編譯PHP的時候,指定mysql.socket的位置: --with-mysql-sock=/var/lib/mysql/mysql.sock
管理PHP-FPM
vim /usr/local/php/etc/php-fpm.conf pid = run/php-fpm.pid error_log = log/php-fpm.log #24行這個在php.ini設置display_errors = Off時啓用 設置完以後重啓服務器 向進程發送信號,就能夠完成進程管理 中止: kill -INT `cat /usr/local/php/var/run/php-fpm.pid` 平滑中止: kill -QUIT `cat /usr/local/php/var/run/php-fpm.pid` 重啓:kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` 從新打開日誌:kill -USR1 `cat /usr/local/php/var/run/php-fpm.pid`
配置環境變量
vim /etc/profile export PATH=/usr/local/php/bin:$PATH source /etc/profile
其實php-fpm.service文件php已經幫咱們配置好了,只須要咱們複製到指定位置,並啓用就好了。
cp /usr/local/src/php-7.2.25/sapi/fpm/php-fpm.service /usr/lib/systemd/system/
編輯/usr/lib/systemd/system/php-fpm.service
文件並修改成以下內容:
# It's not recommended to modify this file in-place, because it # will be overwritten during upgrades. If you want to customize, # the best way is to use the "systemctl edit" command. [Unit] Description=The PHP FastCGI Process Manager After=network.target [Service] Type=simple PIDFile=/usr/local/php/var/run/php-fpm.pid ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf ExecReload=/bin/kill -USR2 $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
重載daemon
執行下面的命令從新載入 systemd,掃描新的或有變更的單元便可
systemctl daemon-reload
開機自啓
systemctl enable php-fpm.service
啓動php-fpm
systemctl start php-fpm.service
nginx.conf配置
#user nobody; # 有一個工做的子進程,能夠自行修改,但太大無益,由於要爭奪CPU # 通常設置CPU數 * 核數 worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { #通常是配置Nginx進程與鏈接的特性 #若幾個同時工做 multi_accept on; #打開同時接受多個新網絡鏈接請求的功能。 use epoll; #使用epoll事件驅動,由於epoll的性能相比其餘事件驅動要好不少 worker_connections 10240; #這是指一個子進程最大容許鏈接10240個鏈接 } http { # 這是配置http服務器的主要段 include mime.types; default_type application/octet-stream; #隱藏Nginx軟件版本號 server_tokens off; #激活tcp_nodelay功能,提升I/O性能 tcp_nodelay on; # 設置讀取客戶端請求頭數據的超時時間。此處的數值爲15,其單位是秒,爲經驗參考值 client_header_timeout 15; # 設置讀取客戶端請求體的超時時間 client_body_timeout 15; # 指定響應客戶端的超時時間 send_timeout 25; # 上傳文件大小限制 client_max_body_size 8m; #壓縮配置 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain text/css text/xml application/javascript; gzip_vary on; #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 logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #include extra/*.conf; server { listen 80; server_name www.blog.com; root html; #charset koi8-r; #access_log logs/host.access.log main; location / { index index.php index.html index.htm; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 last; } } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } }
# 解壓源碼文件 tar -zxvf redis-5.0.7.tar.gz # 切換到解壓目錄 cd redis-5.0.7 # 編譯安裝 make PREFIX=/usr/local/redis-5.0.7 install mkdir /usr/local/redis-5.0.7/etc cp redis.conf /usr/local/redis-5.0.7/etc/ # 建立軟連接 cd /usr/local ln -s redis-5.0.7 redis
vim /etc/profile export PATH=/usr/local/redis/bin:$PATH source /etc/profile # 使修改當即生效
讓redis
之後臺進程的形式運行
vim /usr/local/redis/etc/redis.conf # daeonize no(大約136行) # 改成 -> daemonize yes
在 /usr/lib/systemd/system/
添加一個redis.service
文件,並添加以下內容
[Unit] Description=Redis After=network.target [Service] Type=forking PIDFile=/var/run/redis_6379.pid ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf ExecStop=/usr/local/redis/bin/redis-cli shutdown PrivateTmp=true [Install] WantedBy=multi-user.target
重載daemon
執行下面的命令從新載入 systemd,掃描新的或有變更的單元便可
systemctl daemon-reload
開機自啓
systemctl enable redis.service
啓動redis服務
systemctl start redis.service